{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "448accaa-3508-4dc9-8255-b780abe3b15c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams[\"font.sans-serif\"] = \"SimHei\" #解决中文乱码问题\n",
    "import seaborn as sns\n",
    "import gc\n",
    "import random\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.metrics import make_scorer, recall_score,roc_auc_score,accuracy_score,classification_report,confusion_matrix\n",
    "from sklearn import model_selection\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "from imblearn.over_sampling import SMOTE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39353fd9-9a42-4b32-a265-f0ee3ca279cd",
   "metadata": {},
   "source": [
    "### 数据读取\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3f1f9cea-529d-4b2e-bb33-c621f18a8366",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = pd.read_csv(r'data_format1\\train_format1.csv')\n",
    "df_test = pd.read_csv(r'data_format1\\test_format1.csv')\n",
    "user_info = pd.read_csv(r'data_format1\\user_info_format1.csv')\n",
    "user_log = pd.read_csv(r'data_format1\\user_log_format1.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6966a518-bca3-4626-ac60-087f2b0ef968",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(261477, 3) (260864, 3)\n",
      "(424170, 3) (54925330, 7)\n"
     ]
    }
   ],
   "source": [
    "print(df_test.shape,df_train.shape)\n",
    "print(user_info.shape,user_log.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8021f9f0-55df-42b3-a3c7-5ecd37ea66d1",
   "metadata": {},
   "source": [
    "### 数据内存压缩"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a68a0d6f-b8be-4662-aa28-38cf4c869de5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def numeric_types(df):\n",
    "    for column in df.columns:\n",
    "        # 尝试将列转换为数值类型并优化\n",
    "        if pd.api.types.is_integer_dtype(df[column].dtype):\n",
    "            # 尝试转换为整数类型并优化\n",
    "            df[column] = pd.to_numeric(df[column], errors='coerce', downcast='integer')\n",
    "        elif pd.api.types.is_float_dtype(df[column].dtype):\n",
    "            # 如果是浮点数类型，尝试优化为 float32\n",
    "            df[column] = pd.to_numeric(df[column], errors='coerce', downcast='float')\n",
    "        else:\n",
    "            # 如果无法转换为数值类型，保留原始格式\n",
    "            print(f\"列 '{column}' 无法转换为数值类型，保留原始格式。\")\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b5b4f6bc-57ff-44b2-8d3a-de0fb879b177",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 260864 entries, 0 to 260863\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype\n",
      "---  ------       --------------   -----\n",
      " 0   user_id      260864 non-null  int64\n",
      " 1   merchant_id  260864 non-null  int64\n",
      " 2   label        260864 non-null  int64\n",
      "dtypes: int64(3)\n",
      "memory usage: 6.0 MB\n"
     ]
    }
   ],
   "source": [
    "df_train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4df5f638-2bd9-44d0-8482-fd2cc1d30654",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 261477 entries, 0 to 261476\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype  \n",
      "---  ------       --------------   -----  \n",
      " 0   user_id      261477 non-null  int64  \n",
      " 1   merchant_id  261477 non-null  int64  \n",
      " 2   prob         0 non-null       float64\n",
      "dtypes: float64(1), int64(2)\n",
      "memory usage: 6.0 MB\n"
     ]
    }
   ],
   "source": [
    "df_test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "041bc7fa-bead-40ad-bfb3-31a9283733ac",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 424170 entries, 0 to 424169\n",
      "Data columns (total 3 columns):\n",
      " #   Column     Non-Null Count   Dtype  \n",
      "---  ------     --------------   -----  \n",
      " 0   user_id    424170 non-null  int64  \n",
      " 1   age_range  421953 non-null  float64\n",
      " 2   gender     417734 non-null  float64\n",
      "dtypes: float64(2), int64(1)\n",
      "memory usage: 9.7 MB\n"
     ]
    }
   ],
   "source": [
    "user_info.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c013cf66-5558-47b0-84fe-4e6824fd824f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 54925330 entries, 0 to 54925329\n",
      "Data columns (total 7 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_id      int64  \n",
      " 1   item_id      int64  \n",
      " 2   cat_id       int64  \n",
      " 3   seller_id    int64  \n",
      " 4   brand_id     float64\n",
      " 5   time_stamp   int64  \n",
      " 6   action_type  int64  \n",
      "dtypes: float64(1), int64(6)\n",
      "memory usage: 2.9 GB\n"
     ]
    }
   ],
   "source": [
    "user_log.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "1e0f2d25-5ec1-4f2f-9ece-4fb069346c7c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 260864 entries, 0 to 260863\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype\n",
      "---  ------       --------------   -----\n",
      " 0   user_id      260864 non-null  int32\n",
      " 1   merchant_id  260864 non-null  int16\n",
      " 2   label        260864 non-null  int8 \n",
      "dtypes: int16(1), int32(1), int8(1)\n",
      "memory usage: 1.7 MB\n"
     ]
    }
   ],
   "source": [
    "df_train=numeric_types(df_train)\n",
    "df_train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "dc3cbe7f-beac-4bca-a4aa-a3866017189b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 261477 entries, 0 to 261476\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype  \n",
      "---  ------       --------------   -----  \n",
      " 0   user_id      261477 non-null  int32  \n",
      " 1   merchant_id  261477 non-null  int16  \n",
      " 2   prob         0 non-null       float32\n",
      "dtypes: float32(1), int16(1), int32(1)\n",
      "memory usage: 2.5 MB\n"
     ]
    }
   ],
   "source": [
    "df_test=numeric_types(df_test)\n",
    "df_test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6e20547b-04d3-484e-8f97-a628fe02b540",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 424170 entries, 0 to 424169\n",
      "Data columns (total 3 columns):\n",
      " #   Column     Non-Null Count   Dtype  \n",
      "---  ------     --------------   -----  \n",
      " 0   user_id    424170 non-null  int32  \n",
      " 1   age_range  421953 non-null  float32\n",
      " 2   gender     417734 non-null  float32\n",
      "dtypes: float32(2), int32(1)\n",
      "memory usage: 4.9 MB\n"
     ]
    }
   ],
   "source": [
    "user_info=numeric_types(user_info)\n",
    "user_info.info()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8d59975a-5811-4fd5-9b8a-5555e2b1f86f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 54925330 entries, 0 to 54925329\n",
      "Data columns (total 7 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_id      int32  \n",
      " 1   item_id      int32  \n",
      " 2   cat_id       int16  \n",
      " 3   seller_id    int16  \n",
      " 4   brand_id     float32\n",
      " 5   time_stamp   int16  \n",
      " 6   action_type  int8   \n",
      "dtypes: float32(1), int16(3), int32(2), int8(1)\n",
      "memory usage: 995.2 MB\n"
     ]
    }
   ],
   "source": [
    "user_log=numeric_types(user_log)\n",
    "user_log.info()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3a58e7dc-fdb0-45cc-825a-d462ca26428d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "54925330"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_log.shape[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "329437c7-1e96-4a3b-92d7-fc71af06f8a6",
   "metadata": {},
   "source": [
    "### 重复数据查看"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "698c2a08-481f-4ede-bf27-7ec1c36f492c",
   "metadata": {},
   "source": [
    "用户行为重复数据查看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a2a26666-5c42-4d19-adc2-6c5cec4a0103",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id        0.250343\n",
       "item_id        0.250343\n",
       "cat_id         0.250343\n",
       "seller_id      0.250343\n",
       "brand_id       0.250278\n",
       "time_stamp     0.250343\n",
       "action_type    0.250343\n",
       "dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duplicate_rows=user_log[user_log.duplicated()]\n",
    "duplicate_rows.count()/user_log.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ab7480cc-c882-4b25-90a0-0f4a9eef5400",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>seller_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>action_type</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>13469956</td>\n",
       "      <td>13469956</td>\n",
       "      <td>13469956</td>\n",
       "      <td>13469956</td>\n",
       "      <td>13469956</td>\n",
       "      <td>13469956</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1943</td>\n",
       "      <td>1943</td>\n",
       "      <td>1943</td>\n",
       "      <td>1943</td>\n",
       "      <td>0</td>\n",
       "      <td>1943</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>278299</td>\n",
       "      <td>278299</td>\n",
       "      <td>278299</td>\n",
       "      <td>278299</td>\n",
       "      <td>276632</td>\n",
       "      <td>278299</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              user_id   item_id    cat_id  seller_id  brand_id  time_stamp\n",
       "action_type                                                               \n",
       "0            13469956  13469956  13469956   13469956  13469956    13469956\n",
       "1                1943      1943      1943       1943         0        1943\n",
       "2              278299    278299    278299     278299    276632      278299"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duplicate_rows.groupby('action_type').count()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e10f631-947e-486a-874c-51bafa25cf99",
   "metadata": {},
   "source": [
    "结论：重复数据主要是由于重复点击，重复数据占总数据的25%，不能简单删除，后续可以对数据进行聚合或转换为新的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6d34bda1-ef4f-4795-975b-14be3c06f8cc",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\不羁的风\\AppData\\Local\\Temp\\ipykernel_8152\\4029415011.py:1: DeprecationWarning: Parsing dates involving a day of month without a year specified is ambiguious\n",
      "and fails to parse leap day. The default behavior will change in Python 3.15\n",
      "to either always raise an exception or to use a different default year (TBD).\n",
      "To avoid trouble, add a specific year to the input & format.\n",
      "See https://github.com/python/cpython/issues/70647.\n",
      "  user_log['time_stamp'] = pd.to_datetime(user_log['time_stamp'],format='%m%d')\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>seller_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "      <th>action_type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>328862</td>\n",
       "      <td>323294</td>\n",
       "      <td>833</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>328862</td>\n",
       "      <td>844400</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>328862</td>\n",
       "      <td>575153</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>328862</td>\n",
       "      <td>996875</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>328862</td>\n",
       "      <td>1086186</td>\n",
       "      <td>1271</td>\n",
       "      <td>1253</td>\n",
       "      <td>1049.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925325</th>\n",
       "      <td>208016</td>\n",
       "      <td>107662</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925326</th>\n",
       "      <td>208016</td>\n",
       "      <td>1058313</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925327</th>\n",
       "      <td>208016</td>\n",
       "      <td>449814</td>\n",
       "      <td>898</td>\n",
       "      <td>983</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925328</th>\n",
       "      <td>208016</td>\n",
       "      <td>634856</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925329</th>\n",
       "      <td>208016</td>\n",
       "      <td>272094</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>54925330 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  item_id  cat_id  seller_id  brand_id time_stamp  \\\n",
       "0          328862   323294     833       2882    2661.0 1900-08-29   \n",
       "1          328862   844400    1271       2882    2661.0 1900-08-29   \n",
       "2          328862   575153    1271       2882    2661.0 1900-08-29   \n",
       "3          328862   996875    1271       2882    2661.0 1900-08-29   \n",
       "4          328862  1086186    1271       1253    1049.0 1900-08-29   \n",
       "...           ...      ...     ...        ...       ...        ...   \n",
       "54925325   208016   107662     898       1346    7995.0 1900-11-10   \n",
       "54925326   208016  1058313     898       1346    7995.0 1900-11-10   \n",
       "54925327   208016   449814     898        983    7995.0 1900-11-10   \n",
       "54925328   208016   634856     898       1346    7995.0 1900-11-10   \n",
       "54925329   208016   272094     898       1346    7995.0 1900-11-11   \n",
       "\n",
       "          action_type  \n",
       "0                   0  \n",
       "1                   0  \n",
       "2                   0  \n",
       "3                   0  \n",
       "4                   0  \n",
       "...               ...  \n",
       "54925325            0  \n",
       "54925326            0  \n",
       "54925327            0  \n",
       "54925328            0  \n",
       "54925329            0  \n",
       "\n",
       "[54925330 rows x 7 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_log['time_stamp'] = pd.to_datetime(user_log['time_stamp'],format='%m%d')\n",
    "user_log"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f86f72e7-34d5-47b5-9ac0-06240ecab28d",
   "metadata": {},
   "source": [
    "### 用户行为初步可视化分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "53cb145d-3b0f-4519-8948-99f09b45d118",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>seller_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "      <th>action_type_0</th>\n",
       "      <th>action_type_1</th>\n",
       "      <th>action_type_2</th>\n",
       "      <th>action_type_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>328862</td>\n",
       "      <td>323294</td>\n",
       "      <td>833</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>328862</td>\n",
       "      <td>844400</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>328862</td>\n",
       "      <td>575153</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>328862</td>\n",
       "      <td>996875</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>328862</td>\n",
       "      <td>1086186</td>\n",
       "      <td>1271</td>\n",
       "      <td>1253</td>\n",
       "      <td>1049.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925325</th>\n",
       "      <td>208016</td>\n",
       "      <td>107662</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925326</th>\n",
       "      <td>208016</td>\n",
       "      <td>1058313</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925327</th>\n",
       "      <td>208016</td>\n",
       "      <td>449814</td>\n",
       "      <td>898</td>\n",
       "      <td>983</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925328</th>\n",
       "      <td>208016</td>\n",
       "      <td>634856</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925329</th>\n",
       "      <td>208016</td>\n",
       "      <td>272094</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>54925330 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  item_id  cat_id  seller_id  brand_id time_stamp  \\\n",
       "0          328862   323294     833       2882    2661.0 1900-08-29   \n",
       "1          328862   844400    1271       2882    2661.0 1900-08-29   \n",
       "2          328862   575153    1271       2882    2661.0 1900-08-29   \n",
       "3          328862   996875    1271       2882    2661.0 1900-08-29   \n",
       "4          328862  1086186    1271       1253    1049.0 1900-08-29   \n",
       "...           ...      ...     ...        ...       ...        ...   \n",
       "54925325   208016   107662     898       1346    7995.0 1900-11-10   \n",
       "54925326   208016  1058313     898       1346    7995.0 1900-11-10   \n",
       "54925327   208016   449814     898        983    7995.0 1900-11-10   \n",
       "54925328   208016   634856     898       1346    7995.0 1900-11-10   \n",
       "54925329   208016   272094     898       1346    7995.0 1900-11-11   \n",
       "\n",
       "          action_type_0  action_type_1  action_type_2  action_type_3  \n",
       "0                  True          False          False          False  \n",
       "1                  True          False          False          False  \n",
       "2                  True          False          False          False  \n",
       "3                  True          False          False          False  \n",
       "4                  True          False          False          False  \n",
       "...                 ...            ...            ...            ...  \n",
       "54925325           True          False          False          False  \n",
       "54925326           True          False          False          False  \n",
       "54925327           True          False          False          False  \n",
       "54925328           True          False          False          False  \n",
       "54925329           True          False          False          False  \n",
       "\n",
       "[54925330 rows x 10 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "demmies_action_type=pd.get_dummies(user_log['action_type'], prefix='action_type')\n",
    "user_log = pd.concat([user_log, demmies_action_type], axis=1)\n",
    "user_log.drop('action_type',inplace=True,axis=1)\n",
    "user_log "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "2244f9ee-7c8c-45ee-a6d2-bc478bd7f2b2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>seller_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "      <th>action_type_0</th>\n",
       "      <th>action_type_1</th>\n",
       "      <th>action_type_2</th>\n",
       "      <th>action_type_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>328862</td>\n",
       "      <td>81766</td>\n",
       "      <td>614</td>\n",
       "      <td>4605</td>\n",
       "      <td>7622.0</td>\n",
       "      <td>1900-07-09</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>328862</td>\n",
       "      <td>853901</td>\n",
       "      <td>267</td>\n",
       "      <td>3073</td>\n",
       "      <td>8126.0</td>\n",
       "      <td>1900-08-05</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>328862</td>\n",
       "      <td>1102596</td>\n",
       "      <td>267</td>\n",
       "      <td>3073</td>\n",
       "      <td>8126.0</td>\n",
       "      <td>1900-08-05</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>328862</td>\n",
       "      <td>963870</td>\n",
       "      <td>267</td>\n",
       "      <td>3073</td>\n",
       "      <td>8126.0</td>\n",
       "      <td>1900-08-05</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>328862</td>\n",
       "      <td>813647</td>\n",
       "      <td>267</td>\n",
       "      <td>3073</td>\n",
       "      <td>8126.0</td>\n",
       "      <td>1900-08-05</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925253</th>\n",
       "      <td>128038</td>\n",
       "      <td>1022583</td>\n",
       "      <td>883</td>\n",
       "      <td>2031</td>\n",
       "      <td>2446.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925254</th>\n",
       "      <td>128038</td>\n",
       "      <td>1083994</td>\n",
       "      <td>748</td>\n",
       "      <td>2002</td>\n",
       "      <td>3940.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925273</th>\n",
       "      <td>34885</td>\n",
       "      <td>490526</td>\n",
       "      <td>1620</td>\n",
       "      <td>3444</td>\n",
       "      <td>5308.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925276</th>\n",
       "      <td>208016</td>\n",
       "      <td>51712</td>\n",
       "      <td>898</td>\n",
       "      <td>3763</td>\n",
       "      <td>8434.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925277</th>\n",
       "      <td>208016</td>\n",
       "      <td>1024462</td>\n",
       "      <td>898</td>\n",
       "      <td>3763</td>\n",
       "      <td>8434.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3292144 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  item_id  cat_id  seller_id  brand_id time_stamp  \\\n",
       "19         328862    81766     614       4605    7622.0 1900-07-09   \n",
       "23         328862   853901     267       3073    8126.0 1900-08-05   \n",
       "24         328862  1102596     267       3073    8126.0 1900-08-05   \n",
       "25         328862   963870     267       3073    8126.0 1900-08-05   \n",
       "26         328862   813647     267       3073    8126.0 1900-08-05   \n",
       "...           ...      ...     ...        ...       ...        ...   \n",
       "54925253   128038  1022583     883       2031    2446.0 1900-11-11   \n",
       "54925254   128038  1083994     748       2002    3940.0 1900-11-11   \n",
       "54925273    34885   490526    1620       3444    5308.0 1900-11-11   \n",
       "54925276   208016    51712     898       3763    8434.0 1900-11-11   \n",
       "54925277   208016  1024462     898       3763    8434.0 1900-11-11   \n",
       "\n",
       "          action_type_0  action_type_1  action_type_2  action_type_3  \n",
       "19                False          False           True          False  \n",
       "23                False          False           True          False  \n",
       "24                False          False           True          False  \n",
       "25                False          False           True          False  \n",
       "26                False          False           True          False  \n",
       "...                 ...            ...            ...            ...  \n",
       "54925253          False          False           True          False  \n",
       "54925254          False          False           True          False  \n",
       "54925273          False          False           True          False  \n",
       "54925276          False          False           True          False  \n",
       "54925277          False          False           True          False  \n",
       "\n",
       "[3292144 rows x 10 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#筛选出用户购买的数据，进一步可视化分析\n",
    "df=user_log[user_log['action_type_2']== True]   \n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "619ebd4e-09d4-463c-9326-f489838e282a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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RRfpbd26dVJRUSH33XffMX9eZWWlXHfddXol4o0bN4rT6ZTf/e53oQAp2O21du1aff+yyy7Tj9Vrb7vtNpk/f76e/v7gwYPypz/9KfRz4+Pj5ec//7n87//+r/zf//2fDpY++eQTvU8FYI8++qisWLFC/vOf/+j9ACLHGcH3BmBxcXFxelMBhPryb233kspuDBs2TN+/8cYbdTZFZXOWLVsmLpdLZs6cqTMk999/v1x77bXH/Hnq/dXm8XikT58+Otjw+/16n8q8BCUlJTVpY05Ojl4HJzY2Vr788kudZcnNzQ3tV9mjL774Qk499VS9To762cFMjMrmqMBLURmaJUuWyL333tvqcwegY5GhARB2KoA42v3CwkIpKiqS1NRUHXj86Ec/0o/r6upa/HkqqFLdSM8995z07NlTJk+eLAUFBcdsR21trdx0000yYMAA3a3kcDjE5/Md0bbGbQzKzMwM3e/Xr5/s37+/Fb85gM5CQAOgQ4p/O2KdW1Wjorqgvv76a72pLqI1a9borE1LSkpKpFevXro7SAUW3bt3l5/97GdNXqMyPoe38amnntI1Onv37pX33ntPvve977W6rY1HTKngqXfv3q0+FkDHI6ABcNxU183777+vA4N33323SZajLSZOnCj5+fmycuVKnXV544035MILLzxmsHTgwAFdbPzvf/9bBzdKQ0PDEW1cvny57N69Wz766KNQ7Y3qmlJZoFdeeUWeeeaZVgdmb775prz11lu61kfVDwXrcgBEBgENgOP20EMPyY4dO6R///56lFOwfqWtVDeTqn9RBb0DBw6U119/XT9W9TEtUSOZ1DGqwFcFLqoO5sknn2zyGhWsqNeokU5//vOf9XMqi1NfXy8nnHCCLFy4UG644QadGWqNK664Qh588EEZN26cDsRuueWWdv3OADqGzeiIPDEAdCFq2Laqu1GjnwCYAxkaAKanuqFU9uZomxoxBQBkaACYnqqHUSOgjkYNF1cjmwB0bQQ0AADA8uhyAgAAlkdAAwAALI+ABgAAWB4BDQAAsDwCGgAAYHkENAAAwPIIaAAAgOUR0AAAALG6/w+bHGqMpyHizAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#商品月销量\n",
    "sns.histplot(df[\"time_stamp\"], bins=30, kde=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a853352-9d00-479c-abcb-785313b5a934",
   "metadata": {},
   "source": [
    "结论：将用户购买数据按时间分为30组，可以看出用户在双十一期间购买量暴增，其它日期购买量分布较为均匀"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "96703159-5ad6-4d27-a763-ed00851faf20",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      seller_id  count\n",
      "0             1  17705\n",
      "1             2    189\n",
      "2             3     67\n",
      "3             4    294\n",
      "4             5    144\n",
      "...         ...    ...\n",
      "4990       4991     80\n",
      "4991       4992   1971\n",
      "4992       4993    769\n",
      "4993       4994    164\n",
      "4994       4995    911\n",
      "\n",
      "[4995 rows x 2 columns]\n"
     ]
    },
    {
     "data": {
      "image/png": "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lwakoqKjo83mr2bNmuVynvpk+LE+qcOpDop6eEc41CFc6hEOdVDUw5461KhR444uF/aDpbt27WrS54oVK8y+zhrr1auXGScEAADsFvYtQpGRkbJs2TIZMmSIWUyxQoUKsmvXrlCfFgAA8ICwD0IqJSVFTp06JRkZGWYqvY758QrtinvllVdu65L7MQmHOijq4R3hUIdwqUc41EFRD++I9lgdwn7WGAAAgLVjhAAAAIpDEAIQcn/5y1/ks88+Mwud2nauP6a6exGPX3g6c+aM+X3Q69evl/l9EYRC7MKFC2bl69OnT4f6VPAje57oJABdi0N/PqZ79+7y5ZdfumU6S7JNmzZm+QedKKDX99m4caM0bdrUTCTo0KGDHD9+vFzqUNz9fvDBB9K4cWNJTU01C5/p/p3Ucfz48WZ9L9/WvHnzMq9DsHP1LeCqP/IcSKCykm6vLIVDgCju8Qv2vAn2/A92PdyZPn36FPph8y+++OK25Wp08WL/165v801k0vX8HnroIRk6dKh53ztx4oSUKR0jhNA4f/6807lzZx2j5WRmZjpePL/GjRvfdm7FHT98+LDTsWNHp2bNms4vf/lL59atW27ZO++84zRo0MCJjIx0unbt6mRnZ4esDh999JHTpEkTp2LFik779u2dY8eO3VEddu3a5fzN3/yNU6dOHWfevHnlcv7FPU+++OILJyEhwcnIyHC++uor5x//8R+d5ORkU7Zt2zanevXqztatW01Z3759nb/7u79zr1erVi3nP//zP51vvvnG+Yd/+Afn4YcfLvM6FHe/f/nLX5y6des6hw4dMpdbsWKF06hRoxLrqH7yk584mzZtci5dumS2nJycMq1DsHNVelwf91OnTt123UBlJd1eWVq/fr1To0YNp02bNk7VqlXNvt6/PseKbnrc35NPPumMGzeu0LFQvDaKe/yCPW+CPf9Ler6Vh969e7uP9508pvq81/fVQJ8f+lyrUqWKU57ef//9Qs8ZPYcWLVqYY/6uXr3qvm51+8Mf/uD81V/9lfk/TU9PN9e5fPmyuezIkSOdp59+ukzPmyAUQo888ojzxhtveDIIFRfSijt+7do1Eziee+4584aiH77vvvuuKfvd737n1KtXz3xAZ2VlmTeXoUOHhqQOwd4Ig9Xh22+/dWJjY50ZM2Y4f/zjH52HHnrI2blzpxOq58kHH3xgzt3n008/df76r//a/P3zn/+80AfV0aNHzXUvXrzofPzxxyaU+mgdyuPNsrj7PXPmjHnzLBoYSqpjQUGB+f/Izc11ykuwc71586Z5rk2bNu226xVXFuz2QhEg8vPzC3046WtVL6evBR8Nnvpa1nKfUL02inv8gj1vgj3/g12vvEPEnT6mqampxX5+PProo7cFkLJ08eJFp379+k7Lli3dINS6dWtn7ty5JZ7Hs88+68ycOdP8/b//+78mBProe1///v3L9NwJQiH05Zdfmn+9GISKC2nFHf/www9NwPj+++/Nvib8v/3bvzV/a5jQch/db9WqVUjqEOyNMFgdFixYYL6d+VqItFVp2LBhTqieJxpu9JviwYMHzQebBssRI0aYsscee8yZM2eOe/0TJ06Y6+rlinrrrbecdu3alUs9Srrf69evm29/GuRKquP//d//mQ+9Zs2aOZUrVzbfpPVbfHkpeq6LFi0yLSvLly93Nm7caEKFT7Cy4m6vLN1pANMPJv2A8rly5YoJTFoPf6F8bQR6/II9b4I9D3/I9co6RNzJY7p7924TSvWci35+rFq1yrzHlmcQGjlypDN69GjTeuMLQvrepecW7DzOnj1rAnegLzX6ZVZb7Ys+50obQcgDvBiEigtpxR1/9dVXzQewj76ANVQE8uKLLzopKSllePbBz7W4N8JgddAX+ZgxY9wy7drTN6ryVLQe2nLl677Qrj79Fqlefvll0/2oLRHqpZdecpKSkm67Pf1Abt68ubN48eJyrEXg+9XQWbt2bdPM79/aUFwd9YM8MTHRfHvUb8z9+vUzYag8FD1XfQPXN3LtZpo+fbrTvXt383jn5eUFLSup7uWhuACmXRf6Iev/fJs0aZJpIXnvvfdMt6vv+RXq10agx6+4501Jz8M7uV55hIiSHlNtvdb9devWmXDq//904cIFE6r27NlTbkFo586dpltRu6f9g5AqKQhpS+nzzz9/2/ElS5aYL6nl8bomCHmAF4NQSedW9PjEiROdsWPHFrqMfgB89913t33z0fE3//M//1OGZx38XIt7IwxWhyeeeKJQK4t+O9am6/LkX4/PPvvMiYuLc/bt22e+vU6ZMsWMbdLwph8GOiZIv0l16dLFXE+/IRalAUkvox+G5SnQ/ep5HzhwwHSbDho0qMQ6FqWtQRUqVHDHFZSloueqwUDfsPXb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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#购买次数前10的店铺\n",
    "df_grouped = df.groupby('seller_id').size().reset_index(name='count')\n",
    "print(df_grouped)\n",
    "top_10_shops = df_grouped.sort_values(by='count', ascending=False).head(10)\n",
    "sns.barplot(x=\"seller_id\", y='count' ,data=top_10_shops)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79eed7a9-5c33-49b1-ad6e-7fffd0f6d509",
   "metadata": {},
   "source": [
    "结论：销售量最高的十个商家id为1，1102，1200，1892，2385，3663，3760，3828，4044，4173"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "019370c0-2864-457e-a6ae-4362a552415f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\不羁的风\\AppData\\Local\\Temp\\ipykernel_8152\\284649097.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  df_ac['weekday'] = df_ac[\"time_stamp\"].dt.weekday\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>weekday</th>\n",
       "      <th>user_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>133034</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>138644</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>131309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>121546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>111919</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>114243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>141236</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   weekday  user_num\n",
       "0        0    133034\n",
       "1        1    138644\n",
       "2        2    131309\n",
       "3        3    121546\n",
       "4        4    111919\n",
       "5        5    114243\n",
       "6        6    141236"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#筛选出去除11月份的商品购买数据\n",
    "df_ac=df[df[\"time_stamp\"].dt.month != 11]\n",
    "\n",
    "df_ac['weekday'] = df_ac[\"time_stamp\"].dt.weekday\n",
    "#周一到周天每天购买用户个数\n",
    "df_user = df_ac.groupby('weekday')['user_id'].nunique()  \n",
    "df_user = df_user.to_frame().reset_index()  \n",
    "df_user.columns = ['weekday', 'user_num']  \n",
    "df_user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c50112ec-3196-4e71-adb8-82842ada12ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>weekday</th>\n",
       "      <th>item_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>4892</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>4899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>4910</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>4861</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>4852</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>4866</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>4895</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   weekday  item_num\n",
       "0        0      4892\n",
       "1        1      4899\n",
       "2        2      4910\n",
       "3        3      4861\n",
       "4        4      4852\n",
       "5        5      4866\n",
       "6        6      4895"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#周一到周天每天购买商品个数\n",
    "df_item = df_ac.groupby('weekday')['seller_id'].nunique()  \n",
    "df_item = df_item.to_frame().reset_index()  \n",
    "df_item.columns = ['weekday', 'item_num']  \n",
    "df_item"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "05b24651-d26e-4e08-9024-0edf8813dad4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>weekday</th>\n",
       "      <th>user_item_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>289076</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>316374</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>288544</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>258073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>226070</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>232175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>328191</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   weekday  user_item_num\n",
       "0        0         289076\n",
       "1        1         316374\n",
       "2        2         288544\n",
       "3        3         258073\n",
       "4        4         226070\n",
       "5        5         232175\n",
       "6        6         328191"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#周一到周日每天购买记录个数\n",
    "df_ui = df_ac.groupby('weekday', as_index=False).size()\n",
    "df_ui.columns = ['weekday', 'user_item_num']\n",
    "df_ui"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "e69551bd-7a78-4590-9933-9ca34cc0b563",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x29baf3b5400>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAP/5JREFUeJzt3QucjfX6///LzBhjnMZZg5yJvg7lkK0kUc7kkIhI20YS/4rdVzmkRPFFsVGDKOcoqW07nyppOzzkGJWIkLDFMDnO+j2ua//X2mvGaI8xZq31mdfz8bibuddn3Wvd656Jt+tzuLN4PB6PAAAAIOSFBfoEAAAAkD4IdgAAAI4g2AEAADiCYAcAAOAIgh0AAIAjCHYAAACOINgBAAA4gmAHAADgCIIdAACAIwh2AP5Qy5YtpXTp0jd0zIEDByRLliyyZMkSuXr1qmTNmlUGDBhgbQ899JC0a9cuXc5txowZUrJkyZt6DT1ez1W3yMhIqVy5ssycOVMy0iuvvCIPPPCABLODBw/6rlPy7cknn0z1zytnzpwZ9rMFMqOIQJ8AgOB15coVWbduncTHx8v+/fulTJkyqTquWLFiEhYWJr/++qscOXLEXkeDgTp+/LiFp2DSpk0bGThwoJw7d05WrVolXbt2lejoaGnbtm2gTy1oxMbGyubNm+37uLg4mTt3rqxdu9b2CxQoEOCzA+BFsANwXV9//bWFOq1krVixQp5++ulUHacVOg0CGuJ++ukne8z7VR+7/fbbJZgULFhQatSoYd9r5WzXrl3y9ttvE+z86O+A9xr9/e9/l/DwcN8+gOBBVyyA61q5cqV1wzZr1sy+vxEa3rRip4Gufv36VrHTbtmTJ09KiRIlJJjdcccdVqEEgFBDsANwXRrmNJTppt1uGsxSS8Obt2JXu3ZtOX/+vBw6dEgSExN9FTv9/tVXX5XixYtLrly5pHHjxvLjjz8meZ2PPvrIum6zZ88ud911l6xevfq67/nhhx9KtmzZ5LPPPruJTy1y7Ngxue222647/i35+C/v/sWLF+V///d/7fMlH6c3bdo0KVu2rHXxaqVLu3yT27hxo1SvXt2eU6dOnSTXQq9lhw4dJH/+/JIvXz5p3769hWR/b775pp2HHq+vo93o/tavXy/33HOPXcuKFStad2p6W758ue8z6Lm89dZb1zznvffes+ubJ08e6d27t123G5ERnwMIVQQ7ACk6c+aMbNq0yUKNbr/99pvt30iw81bstOqnf8l7j/cGu9dee03GjBlj4e6TTz6xbt+GDRvamDylweTRRx+V1q1bW2CoWbOmNGnSRPbu3XvN+2ng07FxGhpatGiRps+sY+z0PDQgPvbYYzd8vHbdfvXVV/LCCy/YuXq9++670rNnT3niiSdk2bJlFnyaN2+e5HNo6NXj//znP8uCBQvk8OHD8te//tXX3rlzZ/nmm29k1qxZFmS0u/jFF1/0tet5a6js16+fTVqpVq2aPPLII77Q9N1338nDDz9sj+u11Aksjz/++B8G5RulQbRVq1b2+bTrXs9Pr8UXX3zhe87vv/8uI0eOlClTpsjo0aPl/fffl6FDh6b6PTLicwAhzQMAKVi0aJFH/4g4fPiwJzEx0VOgQAHPsGHDUn38pEmTPJUrV/Y8/PDDnlWrVnmaN2/uee655zzR0dHW/vvvv3uioqI8Y8eO9R2zfft2e881a9bY/gMPPOBp2bKlr/3q1at2HkOGDLH96dOne0qUKOHZunWrJ1euXJ7hw4ff8OfU4/U9vVt4eLinT58+nkuXLln70KFDPfXq1UtyjPd9/ff12DZt2tg5Jle0aFHPn//8Z9++vnb79u09y5Yt872HHv/RRx/5njNq1ChP2bJlffvvvfeeXR+vZ555xlOxYkXfvl7HrFmzes6dO2f7v/32m+ezzz7znD9/3vaffPJJT9WqVZOc11133eXp0qXLDV8zPd88efJc8/j333/vmTJliv1s1ZkzZzy33Xab580330xynVavXu075qWXXrLfieTXLfk19krPzwG4iMkTAFLkHVOn3aT+jw0ZMuSGKnaXLl2yil2pUqWsYud9ve+//14uXLggzz//vG3+tE27f3fs2CH/+te/bEmN5O3+lUWt4uXIkUN27tyZps+qVZ+XX37ZJgjouUZFRf3h87ULOTk9VrsddTawP+/M4Pvuuy/J5JL58+cneZ52TersXP8JHZcvX/bta9v06dNl0KBBNqnl1KlTSX42Wu1744035H/+53+s6qldufq5tEtU6bXcvn37Ndfyv33WG6FdzVp11d+Rzz//XLZt22bV14SEBN9z9PrUrVvXt1+rVi1r12vk/3muJyM+BxDKCHYAUqQhrlOnTtK/f39fV9/rr79uf3HreLjUjrHTcWD6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nNLgp1U7pW0a3vR+cKpWrVqydetWX9uDDz7oe/3UtGkXr1YLr3ccAABAKArY5AkNXUWKFJFly5bJ+PHjrZKna7d4aYgLDw+3yRXJ23QNl6NH/71+WFrazp07ZwscXu+4lGhXsb6e/wYAABBMArZEs1bkVqxYIc8995x1o2r3a7Zs2ZI8RxfoS0hIsJWk/du8j6u0tHlXpr7ecSkZOXKkDBs2LF0+OwAAobCQemZcfP2DeR/IzHkzZeUnKyUUBaxipxU5nSjx/vvvy8cffyz58uWzSRL+4uPjJTIy8po27+MqLW16XzndrndcSgYOHGhjAL3b4cOH0+lKAACAYNGhTQdZNOvf4/GTy1Yomxw8dFCCWYYHO122RGfBemmY0pCnS5nojFcvva2Gdn9qONMlUPzbtm3bJkWLFrXv09pWo0aN67alRKt72l3rvwEAALdERkZKzpw5JVRleLArX768LT+im1a9XnrpJXn44YeladOmNm5t+vTp9jydFduwYUMbZ6ezVjds2CCrVq2yCRejRo2SRo0a2fPatm0r8+bNs8kQOnZOx+t529q1ayeTJk2SI0eOyPHjx20mrX/bm2++ae/53Xff2Vp43jYAAJAx1q1bZ2vb+tOCz8GDB+3v/UqVKtnESl3d4ocffvA9R8fo62oYMTExNqRLi0Fe+np6rPa26Xj+3bt3y410xT70yENJHqtcp7JV61SFGhXs+w8XffifYz74wFbt0LV2NdfoJE09f/0cOuRMg+KECRNs2Jl+Hs0rzgS72267zULU22+/LXfeeaeNa9MLouPedOkSXa5EL8zixYsteCnd19mzGv50sWFdp27QoEHWVrVqVenXr59V4LTipkFQ18lTui5egwYN7GLrRIm77rpL2rRpY209e/aUQoUK2QLJ+ovx5JNPWtcwAAAIDp07d5Zu3brZ3/saiHTZM6UBT5cw07//N2/eLJs2bZLRo0cnOVaf+/PPP9uSacmD4436asVXcvz74/b9lrVb7PvWzVvb/hcbv7Bgqcu1rV692oaY6Xt6aZh79NFH5dVXX5VPPvnEzkknkDo1eeKhhx5KMT1rZW7//v227IgufZI/f35fW69evayitnfvXlt7zr9M+vrrr9sSKlqZq1evnm+snCZlXdOub9++cv78eWvzLpmiXasrV660SqB+r8udAACA4KHj4bWnTodlaU/f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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#条形宽度\n",
    "bar_width = 0.2\n",
    "#透明度\n",
    "opacity = 0.4\n",
    "\n",
    "plt.bar(df_user['weekday'], df_user['user_num'], bar_width, alpha=opacity, color='c', label='user')\n",
    "plt.bar(df_item['weekday']+bar_width, df_item['item_num'], bar_width, alpha=opacity, color='g', label='item')\n",
    "plt.bar(df_ui['weekday']+bar_width*2, df_ui['user_item_num'], bar_width, alpha=opacity, color='m', label='user_item')\n",
    "\n",
    "plt.xlabel('weekday')\n",
    "plt.ylabel('number')\n",
    "plt.title('A Week Purchase Table')\n",
    "plt.xticks(df_user['weekday'] + bar_width * 3 / 2, (1, 2, 3, 4, 5, 6, 7))\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.legend(prop={'size': 10})\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20897a9b-573a-4f99-8b4e-c9c15a238dc4",
   "metadata": {},
   "source": [
    "    分析：工作日和非工作日对购买影响不大，周一到周日每天购买记录个数是周一到周日每天购买用户个数两倍，说明\n",
    "    一部分用户对购买量贡献很大，这部分用户是商家的重点客户。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20268e4a-6631-42cc-b2d7-819cce171bc2",
   "metadata": {},
   "source": [
    "# 特征工程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4fe42699-0880-42b0-9d0d-e31c5889c1ef",
   "metadata": {},
   "source": [
    "需要根据user_id，和merchant_id（seller_id）,从用户画像表以及用户日志表中提取特征，填写到df_train这个数据框中，从而训练评估模型 需要建立的特征如下：\n",
    "* 用户的年龄(age_range)\n",
    "* 用户的性别(gender)\n",
    "* 某用户在该商家日志的总条数(total_logs)\n",
    "* 用户浏览的商品的数目，就是浏览了多少个商品(unique_item_ids)\n",
    "* 浏览的商品的种类的数目，就是浏览了多少种商品(categories)\n",
    "* 用户浏览的天数(browse_days)\n",
    "* 用户单击的次数(one_clicks)\n",
    "* 用户添加购物车的次数(shopping_carts)\n",
    "* 用户购买的次数(purchase_times)\n",
    "* 用户收藏的次数(favourite_times)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "cd8cf3f0-88c7-444a-adc7-5027262082bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>376517</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>234512</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>344532</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>186135</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>30230</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>424165</th>\n",
       "      <td>395814</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>424166</th>\n",
       "      <td>245950</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>424167</th>\n",
       "      <td>208016</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>424168</th>\n",
       "      <td>272535</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>424169</th>\n",
       "      <td>18031</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>424170 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  age_range  gender\n",
       "0        376517        6.0     1.0\n",
       "1        234512        5.0     0.0\n",
       "2        344532        5.0     0.0\n",
       "3        186135        5.0     0.0\n",
       "4         30230        5.0     0.0\n",
       "...         ...        ...     ...\n",
       "424165   395814        3.0     1.0\n",
       "424166   245950        0.0     1.0\n",
       "424167   208016        NaN     NaN\n",
       "424168   272535        6.0     1.0\n",
       "424169    18031        3.0     1.0\n",
       "\n",
       "[424170 rows x 3 columns]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "7d5ef0ff-1800-4567-8969-a5609a2ea6e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "      <th>action_type_0</th>\n",
       "      <th>action_type_1</th>\n",
       "      <th>action_type_2</th>\n",
       "      <th>action_type_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>328862</td>\n",
       "      <td>323294</td>\n",
       "      <td>833</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>328862</td>\n",
       "      <td>844400</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>328862</td>\n",
       "      <td>575153</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>328862</td>\n",
       "      <td>996875</td>\n",
       "      <td>1271</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>328862</td>\n",
       "      <td>1086186</td>\n",
       "      <td>1271</td>\n",
       "      <td>1253</td>\n",
       "      <td>1049.0</td>\n",
       "      <td>1900-08-29</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925325</th>\n",
       "      <td>208016</td>\n",
       "      <td>107662</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925326</th>\n",
       "      <td>208016</td>\n",
       "      <td>1058313</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925327</th>\n",
       "      <td>208016</td>\n",
       "      <td>449814</td>\n",
       "      <td>898</td>\n",
       "      <td>983</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925328</th>\n",
       "      <td>208016</td>\n",
       "      <td>634856</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-10</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54925329</th>\n",
       "      <td>208016</td>\n",
       "      <td>272094</td>\n",
       "      <td>898</td>\n",
       "      <td>1346</td>\n",
       "      <td>7995.0</td>\n",
       "      <td>1900-11-11</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>54925330 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  item_id  cat_id  merchant_id  brand_id time_stamp  \\\n",
       "0          328862   323294     833         2882    2661.0 1900-08-29   \n",
       "1          328862   844400    1271         2882    2661.0 1900-08-29   \n",
       "2          328862   575153    1271         2882    2661.0 1900-08-29   \n",
       "3          328862   996875    1271         2882    2661.0 1900-08-29   \n",
       "4          328862  1086186    1271         1253    1049.0 1900-08-29   \n",
       "...           ...      ...     ...          ...       ...        ...   \n",
       "54925325   208016   107662     898         1346    7995.0 1900-11-10   \n",
       "54925326   208016  1058313     898         1346    7995.0 1900-11-10   \n",
       "54925327   208016   449814     898          983    7995.0 1900-11-10   \n",
       "54925328   208016   634856     898         1346    7995.0 1900-11-10   \n",
       "54925329   208016   272094     898         1346    7995.0 1900-11-11   \n",
       "\n",
       "          action_type_0  action_type_1  action_type_2  action_type_3  \n",
       "0                  True          False          False          False  \n",
       "1                  True          False          False          False  \n",
       "2                  True          False          False          False  \n",
       "3                  True          False          False          False  \n",
       "4                  True          False          False          False  \n",
       "...                 ...            ...            ...            ...  \n",
       "54925325           True          False          False          False  \n",
       "54925326           True          False          False          False  \n",
       "54925327           True          False          False          False  \n",
       "54925328           True          False          False          False  \n",
       "54925329           True          False          False          False  \n",
       "\n",
       "[54925330 rows x 10 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_log.rename(columns={\"seller_id\":\"merchant_id\"},inplace=True)\n",
    "user_log"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "70eab25b-cb13-4f59-a26a-5dff36fc2d05",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label\n",
       "0         34176         3906      0\n",
       "1         34176          121      0\n",
       "2         34176         4356      1\n",
       "3         34176         2217      0\n",
       "4        230784         4818      0\n",
       "...         ...          ...    ...\n",
       "260859   359807         4325      0\n",
       "260860   294527         3971      0\n",
       "260861   294527          152      0\n",
       "260862   294527         2537      0\n",
       "260863   229247         4140      0\n",
       "\n",
       "[260864 rows x 3 columns]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6285f8b9-dd6c-426c-9226-c0af3806f8fc",
   "metadata": {},
   "source": [
    "### age_range,gender特征添加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "882b249b-b4c9-42ed-b240-07a1ed0209f0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender\n",
       "0         34176         3906      0        6.0     0.0\n",
       "1         34176          121      0        6.0     0.0\n",
       "2         34176         4356      1        6.0     0.0\n",
       "3         34176         2217      0        6.0     0.0\n",
       "4        230784         4818      0        0.0     0.0\n",
       "...         ...          ...    ...        ...     ...\n",
       "260859   359807         4325      0        4.0     1.0\n",
       "260860   294527         3971      0        0.0     1.0\n",
       "260861   294527          152      0        0.0     1.0\n",
       "260862   294527         2537      0        0.0     1.0\n",
       "260863   229247         4140      0        4.0     2.0\n",
       "\n",
       "[260864 rows x 5 columns]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#merge连接时作为连接的键不能是int32，必须是int64\n",
    "df_train['user_id'] = df_train['user_id'].astype('int64')\n",
    "user_info['user_id'] = user_info['user_id'].astype('int64')\n",
    "user_log['user_id'] = user_log['user_id'].astype('int64')\n",
    "\n",
    "df_train = pd.merge(df_train,user_info,on=\"user_id\",how=\"left\")\n",
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "873825e2-5c9d-4e60-905e-7fe50b492e59",
   "metadata": {},
   "source": [
    "### total_logs特征添加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "b2691a87-d65b-46bc-8a48-eca2cccff7dd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>total_logs</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>471</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>739</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>925</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1019</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1156</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058661</th>\n",
       "      <td>424170</td>\n",
       "      <td>1082</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058662</th>\n",
       "      <td>424170</td>\n",
       "      <td>3469</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058663</th>\n",
       "      <td>424170</td>\n",
       "      <td>3736</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058664</th>\n",
       "      <td>424170</td>\n",
       "      <td>4268</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058665</th>\n",
       "      <td>424170</td>\n",
       "      <td>4963</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14058666 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  merchant_id  total_logs\n",
       "0               1          471           1\n",
       "1               1          739           1\n",
       "2               1          925           4\n",
       "3               1         1019          14\n",
       "4               1         1156           1\n",
       "...           ...          ...         ...\n",
       "14058661   424170         1082           1\n",
       "14058662   424170         3469           1\n",
       "14058663   424170         3736          10\n",
       "14058664   424170         4268          25\n",
       "14058665   424170         4963           1\n",
       "\n",
       "[14058666 rows x 3 columns]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_logs_list = user_log.groupby([\"user_id\",\"merchant_id\"]).size().reset_index(name='total_logs')\n",
    "total_logs_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "d169d141-70e8-4da5-afd8-7fc212b96800",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>24</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender  total_logs\n",
       "0         34176         3906      0        6.0     0.0          39\n",
       "1         34176          121      0        6.0     0.0          14\n",
       "2         34176         4356      1        6.0     0.0          18\n",
       "3         34176         2217      0        6.0     0.0           2\n",
       "4        230784         4818      0        0.0     0.0           8\n",
       "...         ...          ...    ...        ...     ...         ...\n",
       "260859   359807         4325      0        4.0     1.0          20\n",
       "260860   294527         3971      0        0.0     1.0          17\n",
       "260861   294527          152      0        0.0     1.0           9\n",
       "260862   294527         2537      0        0.0     1.0           1\n",
       "260863   229247         4140      0        4.0     2.0          24\n",
       "\n",
       "[260864 rows x 6 columns]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train = pd.merge(df_train,total_logs_list,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e431040-5bc9-4030-a6f8-e18d3a3a9221",
   "metadata": {},
   "source": [
    "### unique_item_ids特征添加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "036de32e-6a99-4dbd-aa0f-74c3e374ad1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>unique_item_ids</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>471</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>739</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>925</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1019</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1156</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058661</th>\n",
       "      <td>424170</td>\n",
       "      <td>1082</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058662</th>\n",
       "      <td>424170</td>\n",
       "      <td>3469</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058663</th>\n",
       "      <td>424170</td>\n",
       "      <td>3736</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058664</th>\n",
       "      <td>424170</td>\n",
       "      <td>4268</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058665</th>\n",
       "      <td>424170</td>\n",
       "      <td>4963</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14058666 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  merchant_id  unique_item_ids\n",
       "0               1          471                1\n",
       "1               1          739                1\n",
       "2               1          925                1\n",
       "3               1         1019                1\n",
       "4               1         1156                1\n",
       "...           ...          ...              ...\n",
       "14058661   424170         1082                1\n",
       "14058662   424170         3469                1\n",
       "14058663   424170         3736                7\n",
       "14058664   424170         4268                3\n",
       "14058665   424170         4963                1\n",
       "\n",
       "[14058666 rows x 3 columns]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_item_ids_list = user_log.groupby([user_log[\"user_id\"],user_log[\"merchant_id\"]])[\"item_id\"].nunique().reset_index(name='unique_item_ids')\n",
    "unique_item_ids_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "cc1438f2-8e3a-46eb-991b-ba0911bca9fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "      <th>unique_item_ids</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>24</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender  total_logs  \\\n",
       "0         34176         3906      0        6.0     0.0          39   \n",
       "1         34176          121      0        6.0     0.0          14   \n",
       "2         34176         4356      1        6.0     0.0          18   \n",
       "3         34176         2217      0        6.0     0.0           2   \n",
       "4        230784         4818      0        0.0     0.0           8   \n",
       "...         ...          ...    ...        ...     ...         ...   \n",
       "260859   359807         4325      0        4.0     1.0          20   \n",
       "260860   294527         3971      0        0.0     1.0          17   \n",
       "260861   294527          152      0        0.0     1.0           9   \n",
       "260862   294527         2537      0        0.0     1.0           1   \n",
       "260863   229247         4140      0        4.0     2.0          24   \n",
       "\n",
       "        unique_item_ids  \n",
       "0                    20  \n",
       "1                     1  \n",
       "2                     2  \n",
       "3                     1  \n",
       "4                     1  \n",
       "...                 ...  \n",
       "260859                6  \n",
       "260860                3  \n",
       "260861                1  \n",
       "260862                1  \n",
       "260863               15  \n",
       "\n",
       "[260864 rows x 7 columns]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train = pd.merge(df_train,unique_item_ids_list,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d66c5f7-90d6-4aae-a554-7c9c96a28219",
   "metadata": {},
   "source": [
    "### categories特征构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "3a946626-c0f2-49dd-8d7c-e6821d2eb0e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>categories</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>471</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>739</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>925</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1019</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1156</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058661</th>\n",
       "      <td>424170</td>\n",
       "      <td>1082</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058662</th>\n",
       "      <td>424170</td>\n",
       "      <td>3469</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058663</th>\n",
       "      <td>424170</td>\n",
       "      <td>3736</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058664</th>\n",
       "      <td>424170</td>\n",
       "      <td>4268</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058665</th>\n",
       "      <td>424170</td>\n",
       "      <td>4963</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14058666 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  merchant_id  categories\n",
       "0               1          471           1\n",
       "1               1          739           1\n",
       "2               1          925           1\n",
       "3               1         1019           1\n",
       "4               1         1156           1\n",
       "...           ...          ...         ...\n",
       "14058661   424170         1082           1\n",
       "14058662   424170         3469           1\n",
       "14058663   424170         3736           2\n",
       "14058664   424170         4268           1\n",
       "14058665   424170         4963           1\n",
       "\n",
       "[14058666 rows x 3 columns]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categories_temp = user_log.groupby([\"user_id\",\"merchant_id\"])[\"cat_id\"].nunique().reset_index(name='categories') \n",
    "categories_temp\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "3c3b8834-483a-4017-8477-72d7873993e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "      <th>unique_item_ids</th>\n",
       "      <th>categories</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>24</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender  total_logs  \\\n",
       "0         34176         3906      0        6.0     0.0          39   \n",
       "1         34176          121      0        6.0     0.0          14   \n",
       "2         34176         4356      1        6.0     0.0          18   \n",
       "3         34176         2217      0        6.0     0.0           2   \n",
       "4        230784         4818      0        0.0     0.0           8   \n",
       "...         ...          ...    ...        ...     ...         ...   \n",
       "260859   359807         4325      0        4.0     1.0          20   \n",
       "260860   294527         3971      0        0.0     1.0          17   \n",
       "260861   294527          152      0        0.0     1.0           9   \n",
       "260862   294527         2537      0        0.0     1.0           1   \n",
       "260863   229247         4140      0        4.0     2.0          24   \n",
       "\n",
       "        unique_item_ids  categories  \n",
       "0                    20           6  \n",
       "1                     1           1  \n",
       "2                     2           1  \n",
       "3                     1           1  \n",
       "4                     1           1  \n",
       "...                 ...         ...  \n",
       "260859                6           2  \n",
       "260860                3           1  \n",
       "260861                1           1  \n",
       "260862                1           1  \n",
       "260863               15           1  \n",
       "\n",
       "[260864 rows x 8 columns]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train = pd.merge(df_train,categories_temp,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebc955aa-10f9-4df3-b4a8-cef81c15e954",
   "metadata": {},
   "source": [
    "### browse_days特征构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "3d1d02db-587a-4fa6-9263-51a9b03244b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>browse_days</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>471</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>739</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>925</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1019</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1156</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058661</th>\n",
       "      <td>424170</td>\n",
       "      <td>1082</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058662</th>\n",
       "      <td>424170</td>\n",
       "      <td>3469</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058663</th>\n",
       "      <td>424170</td>\n",
       "      <td>3736</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058664</th>\n",
       "      <td>424170</td>\n",
       "      <td>4268</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14058665</th>\n",
       "      <td>424170</td>\n",
       "      <td>4963</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14058666 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          user_id  merchant_id  browse_days\n",
       "0               1          471            1\n",
       "1               1          739            1\n",
       "2               1          925            1\n",
       "3               1         1019            1\n",
       "4               1         1156            1\n",
       "...           ...          ...          ...\n",
       "14058661   424170         1082            1\n",
       "14058662   424170         3469            1\n",
       "14058663   424170         3736            1\n",
       "14058664   424170         4268            5\n",
       "14058665   424170         4963            1\n",
       "\n",
       "[14058666 rows x 3 columns]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "browse_days_temp = user_log.groupby([\"user_id\",\"merchant_id\"])[\"time_stamp\"].nunique().reset_index(name='browse_days') \n",
    "browse_days_temp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "6fa58ea5-9ed1-43c0-b7b8-1d62551039f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "      <th>unique_item_ids</th>\n",
       "      <th>categories</th>\n",
       "      <th>browse_days</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>24</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender  total_logs  \\\n",
       "0         34176         3906      0        6.0     0.0          39   \n",
       "1         34176          121      0        6.0     0.0          14   \n",
       "2         34176         4356      1        6.0     0.0          18   \n",
       "3         34176         2217      0        6.0     0.0           2   \n",
       "4        230784         4818      0        0.0     0.0           8   \n",
       "...         ...          ...    ...        ...     ...         ...   \n",
       "260859   359807         4325      0        4.0     1.0          20   \n",
       "260860   294527         3971      0        0.0     1.0          17   \n",
       "260861   294527          152      0        0.0     1.0           9   \n",
       "260862   294527         2537      0        0.0     1.0           1   \n",
       "260863   229247         4140      0        4.0     2.0          24   \n",
       "\n",
       "        unique_item_ids  categories  browse_days  \n",
       "0                    20           6            9  \n",
       "1                     1           1            3  \n",
       "2                     2           1            2  \n",
       "3                     1           1            1  \n",
       "4                     1           1            3  \n",
       "...                 ...         ...          ...  \n",
       "260859                6           2            1  \n",
       "260860                3           1            2  \n",
       "260861                1           1            1  \n",
       "260862                1           1            1  \n",
       "260863               15           1            2  \n",
       "\n",
       "[260864 rows x 9 columns]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train = pd.merge(df_train,browse_days_temp,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f54f311-f597-4599-a100-25e8218558e6",
   "metadata": {},
   "source": [
    "### one_clicks、shopping_carts、purchase_times、favourite_times特征构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "22aa5289-1d0d-4a62-b272-2e7affab2216",
   "metadata": {},
   "outputs": [],
   "source": [
    "one_clicks_temp = user_log.groupby([\"user_id\",\"merchant_id\"])[\"action_type_0\"].count().reset_index(name='one_clicks') \n",
    "shopping_carts_temp = user_log.groupby([\"user_id\",\"merchant_id\"])[\"action_type_1\"].count().reset_index(name='shopping_carts') \n",
    "purchase_times_temp = user_log.groupby([\"user_id\",\"merchant_id\"])[\"action_type_2\"].count().reset_index(name='purchase_times') \n",
    "favourite_times = user_log.groupby([\"user_id\",\"merchant_id\"])[\"action_type_3\"].count().reset_index(name='favourite_times') \n",
    "\n",
    "df_train = pd.merge(df_train,one_clicks_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train = pd.merge(df_train,shopping_carts_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train = pd.merge(df_train,purchase_times_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "df_train = pd.merge(df_train,favourite_times ,on=[\"user_id\",\"merchant_id\"],how=\"left\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9e7943da-c02e-4008-b0e0-4a2de16abd91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "      <th>unique_item_ids</th>\n",
       "      <th>categories</th>\n",
       "      <th>browse_days</th>\n",
       "      <th>one_clicks</th>\n",
       "      <th>shopping_carts</th>\n",
       "      <th>purchase_times</th>\n",
       "      <th>favourite_times</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>39</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>9</td>\n",
       "      <td>39</td>\n",
       "      <td>39</td>\n",
       "      <td>39</td>\n",
       "      <td>39</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>14</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>14</td>\n",
       "      <td>14</td>\n",
       "      <td>14</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>18</td>\n",
       "      <td>18</td>\n",
       "      <td>18</td>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>34176</td>\n",
       "      <td>2217</td>\n",
       "      <td>0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>230784</td>\n",
       "      <td>4818</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>8</td>\n",
       "      <td>8</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260859</th>\n",
       "      <td>359807</td>\n",
       "      <td>4325</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>20</td>\n",
       "      <td>20</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260860</th>\n",
       "      <td>294527</td>\n",
       "      <td>3971</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>17</td>\n",
       "      <td>17</td>\n",
       "      <td>17</td>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260861</th>\n",
       "      <td>294527</td>\n",
       "      <td>152</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>9</td>\n",
       "      <td>9</td>\n",
       "      <td>9</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260862</th>\n",
       "      <td>294527</td>\n",
       "      <td>2537</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>260863</th>\n",
       "      <td>229247</td>\n",
       "      <td>4140</td>\n",
       "      <td>0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>24</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "      <td>24</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>260864 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  label  age_range  gender  total_logs  \\\n",
       "0         34176         3906      0        6.0     0.0          39   \n",
       "1         34176          121      0        6.0     0.0          14   \n",
       "2         34176         4356      1        6.0     0.0          18   \n",
       "3         34176         2217      0        6.0     0.0           2   \n",
       "4        230784         4818      0        0.0     0.0           8   \n",
       "...         ...          ...    ...        ...     ...         ...   \n",
       "260859   359807         4325      0        4.0     1.0          20   \n",
       "260860   294527         3971      0        0.0     1.0          17   \n",
       "260861   294527          152      0        0.0     1.0           9   \n",
       "260862   294527         2537      0        0.0     1.0           1   \n",
       "260863   229247         4140      0        4.0     2.0          24   \n",
       "\n",
       "        unique_item_ids  categories  browse_days  one_clicks  shopping_carts  \\\n",
       "0                    20           6            9          39              39   \n",
       "1                     1           1            3          14              14   \n",
       "2                     2           1            2          18              18   \n",
       "3                     1           1            1           2               2   \n",
       "4                     1           1            3           8               8   \n",
       "...                 ...         ...          ...         ...             ...   \n",
       "260859                6           2            1          20              20   \n",
       "260860                3           1            2          17              17   \n",
       "260861                1           1            1           9               9   \n",
       "260862                1           1            1           1               1   \n",
       "260863               15           1            2          24              24   \n",
       "\n",
       "        purchase_times  favourite_times  \n",
       "0                   39               39  \n",
       "1                   14               14  \n",
       "2                   18               18  \n",
       "3                    2                2  \n",
       "4                    8                8  \n",
       "...                ...              ...  \n",
       "260859              20               20  \n",
       "260860              17               17  \n",
       "260861               9                9  \n",
       "260862               1                1  \n",
       "260863              24               24  \n",
       "\n",
       "[260864 rows x 13 columns]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "187622a6-bc6d-4aaf-8026-7710392ee8c3",
   "metadata": {},
   "source": [
    "### 建立好的特征缺失值处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c72d8d84-3243-4892-aabb-78971703a460",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id               0\n",
       "merchant_id           0\n",
       "label                 0\n",
       "age_range          1253\n",
       "gender             3711\n",
       "total_logs            0\n",
       "unique_item_ids       0\n",
       "categories            0\n",
       "browse_days           0\n",
       "one_clicks            0\n",
       "shopping_carts        0\n",
       "purchase_times        0\n",
       "favourite_times       0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.isnull().sum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "a8889121-ee16-43c1-b3c3-6793d841e374",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 260864 entries, 0 to 260863\n",
      "Data columns (total 13 columns):\n",
      " #   Column           Non-Null Count   Dtype  \n",
      "---  ------           --------------   -----  \n",
      " 0   user_id          260864 non-null  int64  \n",
      " 1   merchant_id      260864 non-null  int16  \n",
      " 2   label            260864 non-null  int8   \n",
      " 3   age_range        260864 non-null  float32\n",
      " 4   gender           260864 non-null  float32\n",
      " 5   total_logs       260864 non-null  int64  \n",
      " 6   unique_item_ids  260864 non-null  int64  \n",
      " 7   categories       260864 non-null  int64  \n",
      " 8   browse_days      260864 non-null  int64  \n",
      " 9   one_clicks       260864 non-null  int64  \n",
      " 10  shopping_carts   260864 non-null  int64  \n",
      " 11  purchase_times   260864 non-null  int64  \n",
      " 12  favourite_times  260864 non-null  int64  \n",
      "dtypes: float32(2), int16(1), int64(9), int8(1)\n",
      "memory usage: 20.6 MB\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\不羁的风\\AppData\\Local\\Temp\\ipykernel_8152\\2526087568.py:1: FutureWarning: Series.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.\n",
      "  df_train['age_range']=df_train['age_range'].fillna(method='ffill')\n"
     ]
    }
   ],
   "source": [
    "df_train['age_range']=df_train['age_range'].fillna(method='ffill')\n",
    "df_train['gender']=df_train['gender'].fillna(2)\n",
    "df_train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "119b7503-685f-4b59-9c41-c82ed382c6f2",
   "metadata": {},
   "source": [
    "### 保存建立好的特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "30296115-26f8-49c8-9999-b585ed169fed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>prob</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "      <th>total_logs</th>\n",
       "      <th>unique_item_ids</th>\n",
       "      <th>categories</th>\n",
       "      <th>browse_days</th>\n",
       "      <th>one_clicks</th>\n",
       "      <th>shopping_carts</th>\n",
       "      <th>purchase_times</th>\n",
       "      <th>favourite_times</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>163968</td>\n",
       "      <td>4605</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>360576</td>\n",
       "      <td>1581</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>10</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>98688</td>\n",
       "      <td>1964</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>98688</td>\n",
       "      <td>3645</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>295296</td>\n",
       "      <td>3361</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>50</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261472</th>\n",
       "      <td>228479</td>\n",
       "      <td>3111</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261473</th>\n",
       "      <td>97919</td>\n",
       "      <td>2341</td>\n",
       "      <td>NaN</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261474</th>\n",
       "      <td>97919</td>\n",
       "      <td>3971</td>\n",
       "      <td>NaN</td>\n",
       "      <td>8.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>16</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>16</td>\n",
       "      <td>16</td>\n",
       "      <td>16</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261475</th>\n",
       "      <td>32639</td>\n",
       "      <td>3536</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>261476</th>\n",
       "      <td>32639</td>\n",
       "      <td>3319</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>261477 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id  merchant_id  prob  age_range  gender  total_logs  \\\n",
       "0        163968         4605   NaN        0.0     0.0           2   \n",
       "1        360576         1581   NaN        2.0     2.0          10   \n",
       "2         98688         1964   NaN        6.0     0.0           6   \n",
       "3         98688         3645   NaN        6.0     0.0          11   \n",
       "4        295296         3361   NaN        2.0     1.0          50   \n",
       "...         ...          ...   ...        ...     ...         ...   \n",
       "261472   228479         3111   NaN        6.0     0.0           5   \n",
       "261473    97919         2341   NaN        8.0     1.0           2   \n",
       "261474    97919         3971   NaN        8.0     1.0          16   \n",
       "261475    32639         3536   NaN        0.0     0.0           3   \n",
       "261476    32639         3319   NaN        0.0     0.0          11   \n",
       "\n",
       "        unique_item_ids  categories  browse_days  one_clicks  shopping_carts  \\\n",
       "0                     1           1            1           2               2   \n",
       "1                     9           4            1          10              10   \n",
       "2                     1           1            1           6               6   \n",
       "3                     1           1            1          11              11   \n",
       "4                     8           4            5          50              50   \n",
       "...                 ...         ...          ...         ...             ...   \n",
       "261472                2           1            2           5               5   \n",
       "261473                1           1            1           2               2   \n",
       "261474                5           2            3          16              16   \n",
       "261475                2           1            1           3               3   \n",
       "261476                1           1            2          11              11   \n",
       "\n",
       "        purchase_times  favourite_times  \n",
       "0                    2                2  \n",
       "1                   10               10  \n",
       "2                    6                6  \n",
       "3                   11               11  \n",
       "4                   50               50  \n",
       "...                ...              ...  \n",
       "261472               5                5  \n",
       "261473               2                2  \n",
       "261474              16               16  \n",
       "261475               3                3  \n",
       "261476              11               11  \n",
       "\n",
       "[261477 rows x 13 columns]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test = pd.merge(df_test,user_info ,on=[\"user_id\"],how=\"left\")\n",
    "df_test = pd.merge(df_test,total_logs_list ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,unique_item_ids_list ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,categories_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,browse_days_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,one_clicks_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,shopping_carts_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,purchase_times_temp ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "df_test = pd.merge(df_test,favourite_times ,on=[\"user_id\",\"merchant_id\"],how=\"left\") \n",
    "\n",
    "df_test "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "fe0d0395-57b9-4786-bdb8-9a008c7f0ef1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id                 0\n",
       "merchant_id             0\n",
       "prob               261477\n",
       "age_range            1325\n",
       "gender               3834\n",
       "total_logs              0\n",
       "unique_item_ids         0\n",
       "categories              0\n",
       "browse_days             0\n",
       "one_clicks              0\n",
       "shopping_carts          0\n",
       "purchase_times          0\n",
       "favourite_times         0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test.isnull().sum(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "dfd29595-68f4-4428-a95f-6dfcb9a63d08",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 261477 entries, 0 to 261476\n",
      "Data columns (total 13 columns):\n",
      " #   Column           Non-Null Count   Dtype  \n",
      "---  ------           --------------   -----  \n",
      " 0   user_id          261477 non-null  int32  \n",
      " 1   merchant_id      261477 non-null  int16  \n",
      " 2   prob             0 non-null       float32\n",
      " 3   age_range        261477 non-null  float32\n",
      " 4   gender           261477 non-null  float32\n",
      " 5   total_logs       261477 non-null  int64  \n",
      " 6   unique_item_ids  261477 non-null  int64  \n",
      " 7   categories       261477 non-null  int64  \n",
      " 8   browse_days      261477 non-null  int64  \n",
      " 9   one_clicks       261477 non-null  int64  \n",
      " 10  shopping_carts   261477 non-null  int64  \n",
      " 11  purchase_times   261477 non-null  int64  \n",
      " 12  favourite_times  261477 non-null  int64  \n",
      "dtypes: float32(3), int16(1), int32(1), int64(8)\n",
      "memory usage: 20.4 MB\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\不羁的风\\AppData\\Local\\Temp\\ipykernel_8152\\249957881.py:1: FutureWarning: Series.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.\n",
      "  df_test['age_range']=df_test['age_range'].fillna(method='ffill')\n"
     ]
    }
   ],
   "source": [
    "df_test['age_range']=df_test['age_range'].fillna(method='ffill')\n",
    "df_test['gender']=df_test['gender'].fillna(2)\n",
    "df_test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "58d37437-98f8-4274-9ecf-9a6f2969d67f",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train.to_csv('df_train.csv',index=False )\n",
    "df_test.to_csv('df_test.csv',index=False )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e244ebef-8e1a-43ce-8ca4-c9254648d874",
   "metadata": {},
   "source": [
    "# 模型构建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "id": "e1a3ab41-2c33-432e-ae5a-2f9d96bdb769",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = pd.read_csv('df_train.csv')\n",
    "df_test = pd.read_csv('df_test.csv')\n",
    "df_train.drop(['user_id','merchant_id'],axis=1,inplace=True)\n",
    "df_test.drop(['user_id','merchant_id'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "id": "c0761f9b-f8c7-41f5-8386-3e0e4fe86f5a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "各类别的数量：\n",
      "label\n",
      "0    244912\n",
      "1     15952\n",
      "Name: count, dtype: int64\n",
      "\n",
      "各类别的占比：\n",
      "label\n",
      "0    0.938849\n",
      "1    0.061151\n",
      "Name: count, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "label_counts = df_train['label'].value_counts()\n",
    "label_percentages = label_counts / len(df_train['label'])\n",
    "# 打印结果\n",
    "print(\"各类别的数量：\")\n",
    "print(label_counts)\n",
    "print(\"\\n各类别的占比：\")\n",
    "print(label_percentages)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0e8ad01-3fa6-47b9-84ea-adc92c403b57",
   "metadata": {},
   "source": [
    "类别0的占比是0.938849，类比1的占比是0.061151，数据明显不平衡"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "787bfda0-805e-44f9-96da-e99c5df1b488",
   "metadata": {},
   "source": [
    "### 归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "b90c3a9b-288e-4b0b-9e2c-3e16fc59caec",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Python\\Lib\\site-packages\\sklearn\\utils\\_array_api.py:776: RuntimeWarning: All-NaN slice encountered\n",
      "  return xp.asarray(numpy.nanmin(X, axis=axis))\n",
      "E:\\Python\\Lib\\site-packages\\sklearn\\utils\\_array_api.py:793: RuntimeWarning: All-NaN slice encountered\n",
      "  return xp.asarray(numpy.nanmax(X, axis=axis))\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "\n",
    "# 对数据进行归一化处理\n",
    "train = pd.DataFrame(scaler.fit_transform(df_train), columns=df_train.columns)\n",
    "test = pd.DataFrame(scaler.fit_transform(df_test), columns=df_test.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "270873b2-6427-4567-ab8c-1da132aae28f",
   "metadata": {},
   "source": [
    "### somte过采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "id": "bf2624d3-267c-46c2-9e80-01416ab74e26",
   "metadata": {},
   "outputs": [],
   "source": [
    "Y = train['label']\n",
    "X = train.drop(['label'],axis = 1)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "id": "b42d38cf-b2ed-41f6-9f7e-272a9e768afa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label\n",
      "0.0    244912\n",
      "1.0    244912\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "#用somte方法进行过采样\n",
    "smote = SMOTE(random_state=42)\n",
    "X_res, Y_res = smote.fit_resample(X, Y)\n",
    "print(pd.Series(Y_res).value_counts())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "7ddbdad3-3128-46bd-a088-706003b3aa14",
   "metadata": {},
   "outputs": [],
   "source": [
    "#数据分割\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_res, Y_res, test_size = 0.25,random_state = 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7284fbed-6982-4e60-88ee-5d9f1376555e",
   "metadata": {},
   "source": [
    "### Logistic 回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "3f88da0f-04b2-4e4b-a49a-87556497eb5b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      "[[0.55398442 0.44601558]\n",
      " [0.50533449 0.49466551]\n",
      " [0.41246786 0.58753214]\n",
      " ...\n",
      " [0.56250603 0.43749397]\n",
      " [0.545074   0.454926  ]\n",
      " [0.55077823 0.44922177]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.574124583523878"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Logit = LogisticRegression( solver='liblinear')\n",
    "Logit.fit(X_train, y_train)\n",
    "Predict = Logit.predict(X_test)\n",
    "Predict_proba = Logit.predict_proba(X_test)\n",
    "print(Predict[0:20])\n",
    "print(Predict_proba[:])\n",
    "Score = accuracy_score(y_test, Predict)\n",
    "Score\n",
    "# 一般的准确率验证方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "e4031a76-ffa2-4fbb-b5f7-8c020ec686dd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC Score: 0.5743484073916322\n"
     ]
    }
   ],
   "source": [
    "auc_score = roc_auc_score(y_test, Predict)\n",
    "print(f\"AUC Score: {auc_score}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "8f3333e9-2653-4031-b3c7-057cf2791785",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.38915532935303904"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall = recall_score(y_test, Predict) \n",
    "recall "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "dbb6e5ef-93d5-42eb-8d98-54394cb4f5d4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lr.coef_: [[ 0.26317127 -0.22871489 -0.82782009  4.78194609  3.97851319  2.65868025\n",
      "  -0.82782009 -0.82782009 -0.82782009 -0.82782009]]\n",
      "lr.intercept_: [-0.27778761]\n"
     ]
    }
   ],
   "source": [
    "print(\"lr.coef_: {}\".format(Logit.coef_))\n",
    "print(\"lr.intercept_: {}\".format(Logit.intercept_))\n",
    "# 截距与斜率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "3568c5d2-2023-4ec7-91fd-3440d0509415",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率为:  0.9383586835455443\n",
      "召回率为： 0.0019948883086482235\n"
     ]
    }
   ],
   "source": [
    "#初始化逻辑回归算法\n",
    "LogRegAlg=LogisticRegression(random_state=1,solver='liblinear')\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "LogRegAlg.fit(X_train, y_train)\n",
    "#使用sklearn库里面的交叉验证函数获取预测准确率分数\n",
    "scores = model_selection.cross_val_score(LogRegAlg,X_test, y_test,cv=3)\n",
    "#使用交叉验证分数的平均值作为最终的准确率\n",
    "print(\"准确率为: \",scores.mean())\n",
    "\n",
    "\n",
    "# 使用交叉验证计算召回率\n",
    "recall_scores = model_selection.cross_val_score(LogRegAlg, X_test, y_test, cv=3, scoring='recall')\n",
    "\n",
    "# 计算平均召回率\n",
    "print(\"召回率为：\",recall_scores.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eec9115b-6bf7-46be-9972-bc11d05dfd2d",
   "metadata": {},
   "source": [
    "### K近邻模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "75fe69aa-9f4d-4cf3-918e-5e4bf813a23a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean Squared Error: 0.22\n",
      "R - squared: 0.11\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "# 模型实例化，并将邻居个数设为3\n",
    "knn = KNeighborsRegressor(n_neighbors=3)\n",
    "# 利用训练数据和训练目标值来拟合模型\n",
    "knn.fit(X_train, y_train)\n",
    "y_pred = knn.predict(X_test)\n",
    "# 使用均方误差和决定系数评估模型\n",
    "mse = mean_squared_error(y_test, y_pred)\n",
    "r2 = r2_score(y_test, y_pred)\n",
    "print(f\"Mean Squared Error: {mse:.2f}\")\n",
    "print(f\"R - squared: {r2:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c02cb4f7-c461-4e45-bfe0-55e8f9216561",
   "metadata": {},
   "source": [
    "此处R方为 0.11 ，表明该模型对数据的拟合程度较低，自变量对因变量变化的解释能力有限 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a372f063-500f-4557-a4cd-b02d9aab404b",
   "metadata": {},
   "source": [
    "### 决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "093f1349-3a57-4150-a27d-ba14eba876c2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.90393387 0.09606613]\n",
      " [0.96455493 0.03544507]\n",
      " [0.95437044 0.04562956]\n",
      " ...\n",
      " [0.92475472 0.07524528]\n",
      " [0.96455493 0.03544507]\n",
      " [0.92475472 0.07524528]]\n",
      "Accuracy on training set: 0.939\n",
      "Accuracy on test set: 0.938\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "tree = DecisionTreeClassifier(max_depth=4,random_state=0) \n",
    "tree.fit(X_train, y_train)\n",
    "Predict_proba = tree.predict_proba(X_test)\n",
    "print(Predict_proba[:])\n",
    "print(\"Accuracy on training set: {:.3f}\".format(tree.score(X_train, y_train))) \n",
    "print(\"Accuracy on test set: {:.3f}\".format(tree.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "54416318-794b-42e0-bb47-9f9f87532f71",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import export_graphviz\n",
    "export_graphviz(tree, out_file=\"tree.dot\", class_names=[\"0\",\"1\"], feature_names=X.columns.tolist(), impurity=False, filled=True)\n",
    "# 我们可以利用 tree 模块的 export_graphviz 函数来将树可视化。这个函数会生成一 个 .dot 格式的文件，这是一种用于保存图形的文本文件格式。\n",
    "# 设置为结点添加颜色 的选项，颜色表示每个结点中的多数类别，同时传入类别名称和特征名称，这样可以对 树正确标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "f8eee360-5b79-47ff-98e6-d348b85ac4d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 12.2.1 (20241206.2353)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"2435pt\" height=\"491pt\"\n",
       " viewBox=\"0.00 0.00 2435.38 491.25\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 487.25)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-487.25 2431.38,-487.25 2431.38,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<polygon fill=\"#e78946\" stroke=\"black\" points=\"1318.62,-483.25 1157.88,-483.25 1157.88,-412.25 1318.62,-412.25 1318.62,-483.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1238.25\" y=\"-465.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">categories &lt;= 0.047</text>\n",
       "<text text-anchor=\"middle\" x=\"1238.25\" y=\"-450.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 195648</text>\n",
       "<text text-anchor=\"middle\" x=\"1238.25\" y=\"-434.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [183706, 11942]</text>\n",
       "<text text-anchor=\"middle\" x=\"1238.25\" y=\"-418.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<polygon fill=\"#e68844\" stroke=\"black\" points=\"1017.62,-376.25 844.88,-376.25 844.88,-305.25 1017.62,-305.25 1017.62,-376.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-358.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">unique_item_ids &lt;= 0.001</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-343.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 159636</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-327.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [151437, 8199]</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-311.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1157.59,-419.16C1118.12,-405.66 1070.29,-389.3 1028.78,-375.11\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1030.13,-371.87 1019.53,-371.94 1027.86,-378.49 1030.13,-371.87\"/>\n",
       "<text text-anchor=\"middle\" x=\"1029.1\" y=\"-388.48\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 16 -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>16</title>\n",
       "<polygon fill=\"#e89050\" stroke=\"black\" points=\"1633.62,-376.25 1460.88,-376.25 1460.88,-305.25 1633.62,-305.25 1633.62,-376.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-358.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">unique_item_ids &lt;= 0.031</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-343.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 36012</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-327.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [32269, 3743]</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-311.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;16 -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>0&#45;&gt;16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1319.03,-419.3C1359.01,-405.72 1407.58,-389.21 1449.62,-374.93\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1450.66,-378.27 1459.01,-371.74 1448.41,-371.64 1450.66,-378.27\"/>\n",
       "<text text-anchor=\"middle\" x=\"1449.39\" y=\"-388.25\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<polygon fill=\"#e68742\" stroke=\"black\" points=\"525.75,-269.25 356.75,-269.25 356.75,-198.25 525.75,-198.25 525.75,-269.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gender &lt;= 0.25</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-236.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 84199</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-220.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [80564.0, 3635.0]</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-204.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M844.49,-321.16C758.3,-302.69 626.42,-274.43 537.15,-255.3\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"537.93,-251.89 527.42,-253.21 536.46,-258.73 537.93,-251.89\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>9</title>\n",
       "<polygon fill=\"#e78946\" stroke=\"black\" points=\"1017.62,-269.25 844.88,-269.25 844.88,-198.25 1017.62,-198.25 1017.62,-269.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">unique_item_ids &lt;= 0.007</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-236.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 75437</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-220.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [70873, 4564]</text>\n",
       "<text text-anchor=\"middle\" x=\"931.25\" y=\"-204.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;9 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>1&#45;&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M931.25,-304.79C931.25,-297.17 931.25,-289 931.25,-281.02\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"934.75,-281.07 931.25,-271.07 927.75,-281.07 934.75,-281.07\"/>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<polygon fill=\"#e68742\" stroke=\"black\" points=\"287.88,-162.25 134.62,-162.25 134.62,-91.25 287.88,-91.25 287.88,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">browse_days &lt;= 0.136</text>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54025</text>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [51559, 2466]</text>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M364.66,-197.79C343.34,-188.05 320.03,-177.41 298.16,-167.43\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"299.82,-164.34 289.27,-163.37 296.91,-170.71 299.82,-164.34\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<polygon fill=\"#e68641\" stroke=\"black\" points=\"514.12,-162.25 368.38,-162.25 368.38,-91.25 514.12,-91.25 514.12,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">age_range &lt;= 0.438</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 30174</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [29005, 1169]</text>\n",
       "<text text-anchor=\"middle\" x=\"441.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>2&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M441.25,-197.79C441.25,-190.17 441.25,-182 441.25,-174.02\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"444.75,-174.07 441.25,-164.07 437.75,-174.07 444.75,-174.07\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<polygon fill=\"#e68742\" stroke=\"black\" points=\"146.5,-55.25 0,-55.25 0,0 146.5,0 146.5,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"73.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54022</text>\n",
       "<text text-anchor=\"middle\" x=\"73.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [51557, 2465]</text>\n",
       "<text text-anchor=\"middle\" x=\"73.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M161.82,-90.96C148.5,-81.59 134.12,-71.47 120.9,-62.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"122.94,-59.32 112.75,-56.43 118.92,-65.04 122.94,-59.32\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<polygon fill=\"#f2c09c\" stroke=\"black\" points=\"258.25,-55.25 164.25,-55.25 164.25,0 258.25,0 258.25,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3</text>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [2, 1]</text>\n",
       "<text text-anchor=\"middle\" x=\"211.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>3&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M211.25,-90.96C211.25,-83.13 211.25,-74.79 211.25,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"214.75,-67.07 211.25,-57.07 207.75,-67.07 214.75,-67.07\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>7</title>\n",
       "<polygon fill=\"#e68640\" stroke=\"black\" points=\"415.75,-55.25 276.75,-55.25 276.75,0 415.75,0 415.75,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"346.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 18705</text>\n",
       "<text text-anchor=\"middle\" x=\"346.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [18042, 663]</text>\n",
       "<text text-anchor=\"middle\" x=\"346.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;7 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>6&#45;&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.22,-90.96C398.5,-82.04 389.11,-72.45 380.39,-63.52\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"383.14,-61.34 373.65,-56.64 378.14,-66.23 383.14,-61.34\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>8</title>\n",
       "<polygon fill=\"#e68742\" stroke=\"black\" points=\"572.75,-55.25 433.75,-55.25 433.75,0 572.75,0 572.75,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"503.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 11469</text>\n",
       "<text text-anchor=\"middle\" x=\"503.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [10963, 506]</text>\n",
       "<text text-anchor=\"middle\" x=\"503.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;8 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>6&#45;&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M463.46,-90.96C468.8,-82.59 474.53,-73.62 479.92,-65.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"482.81,-67.14 485.24,-56.83 476.91,-63.38 482.81,-67.14\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>10</title>\n",
       "<polygon fill=\"#e78945\" stroke=\"black\" points=\"913.5,-162.25 767,-162.25 767,-91.25 913.5,-91.25 913.5,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">age_range &lt;= 0.438</text>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 62145</text>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [58586, 3559]</text>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;10 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>9&#45;&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M900.95,-197.79C893.58,-189.29 885.61,-180.09 877.95,-171.25\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"880.6,-168.97 871.41,-163.7 875.32,-173.55 880.6,-168.97\"/>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>13</title>\n",
       "<polygon fill=\"#e78b49\" stroke=\"black\" points=\"1107.75,-162.25 938.75,-162.25 938.75,-91.25 1107.75,-91.25 1107.75,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">age_range &lt;= 0.938</text>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 13292</text>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [12287.0, 1005.0]</text>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;13 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>9&#45;&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M961.88,-197.79C969.41,-189.2 977.56,-179.9 985.38,-170.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"987.79,-173.53 991.75,-163.7 982.53,-168.91 987.79,-173.53\"/>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>11</title>\n",
       "<polygon fill=\"#e68844\" stroke=\"black\" points=\"737.5,-55.25 591,-55.25 591,0 737.5,0 737.5,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"664.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 36947</text>\n",
       "<text text-anchor=\"middle\" x=\"664.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [35010, 1937]</text>\n",
       "<text text-anchor=\"middle\" x=\"664.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;11 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>10&#45;&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M777.21,-90.96C759.64,-81.27 740.64,-70.78 723.31,-61.22\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"725.1,-58.21 714.65,-56.44 721.72,-64.34 725.1,-58.21\"/>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>12</title>\n",
       "<polygon fill=\"#e78a47\" stroke=\"black\" points=\"924.75,-55.25 755.75,-55.25 755.75,0 924.75,0 924.75,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 25198</text>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [23576.0, 1622.0]</text>\n",
       "<text text-anchor=\"middle\" x=\"840.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;12 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>10&#45;&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M840.25,-90.96C840.25,-83.13 840.25,-74.79 840.25,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"843.75,-67.07 840.25,-57.07 836.75,-67.07 843.75,-67.07\"/>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>14</title>\n",
       "<polygon fill=\"#e78b49\" stroke=\"black\" points=\"1104,-55.25 942.5,-55.25 942.5,0 1104,0 1104,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 13250</text>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [12253.0, 997.0]</text>\n",
       "<text text-anchor=\"middle\" x=\"1023.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 13&#45;&gt;14 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>13&#45;&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1023.25,-90.96C1023.25,-83.13 1023.25,-74.79 1023.25,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1026.75,-67.07 1023.25,-57.07 1019.75,-67.07 1026.75,-67.07\"/>\n",
       "</g>\n",
       "<!-- 15 -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>15</title>\n",
       "<polygon fill=\"#eb9f68\" stroke=\"black\" points=\"1224,-55.25 1122.5,-55.25 1122.5,0 1224,0 1224,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1173.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 42</text>\n",
       "<text text-anchor=\"middle\" x=\"1173.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [34, 8]</text>\n",
       "<text text-anchor=\"middle\" x=\"1173.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 13&#45;&gt;15 -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>13&#45;&gt;15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1076.98,-90.96C1091.74,-81.4 1107.69,-71.07 1122.29,-61.62\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1123.9,-64.75 1130.39,-56.38 1120.09,-58.88 1123.9,-64.75\"/>\n",
       "</g>\n",
       "<!-- 17 -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>17</title>\n",
       "<polygon fill=\"#e88e4d\" stroke=\"black\" points=\"1633.62,-269.25 1460.88,-269.25 1460.88,-198.25 1633.62,-198.25 1633.62,-269.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">unique_item_ids &lt;= 0.012</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-236.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 29836</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-220.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [27125, 2711]</text>\n",
       "<text text-anchor=\"middle\" x=\"1547.25\" y=\"-204.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 16&#45;&gt;17 -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>16&#45;&gt;17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1547.25,-304.79C1547.25,-297.17 1547.25,-289 1547.25,-281.02\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1550.75,-281.07 1547.25,-271.07 1543.75,-281.07 1550.75,-281.07\"/>\n",
       "</g>\n",
       "<!-- 24 -->\n",
       "<g id=\"node25\" class=\"node\">\n",
       "<title>24</title>\n",
       "<polygon fill=\"#ea9a61\" stroke=\"black\" points=\"2071.75,-269.25 1932.75,-269.25 1932.75,-198.25 2071.75,-198.25 2071.75,-269.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-251.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">categories &lt;= 0.297</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-236.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 6176</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-220.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [5144, 1032]</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-204.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 16&#45;&gt;24 -->\n",
       "<g id=\"edge24\" class=\"edge\">\n",
       "<title>16&#45;&gt;24</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1633.9,-319.75C1716.65,-300.66 1840.37,-272.11 1921.2,-253.45\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1921.88,-256.89 1930.83,-251.23 1920.3,-250.07 1921.88,-256.89\"/>\n",
       "</g>\n",
       "<!-- 18 -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>18</title>\n",
       "<polygon fill=\"#e78c4b\" stroke=\"black\" points=\"1536.5,-162.25 1390,-162.25 1390,-91.25 1536.5,-91.25 1536.5,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1463.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">age_range &lt;= 0.562</text>\n",
       "<text text-anchor=\"middle\" x=\"1463.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 17596</text>\n",
       "<text text-anchor=\"middle\" x=\"1463.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [16161, 1435]</text>\n",
       "<text text-anchor=\"middle\" x=\"1463.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;18 -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>17&#45;&gt;18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1519.28,-197.79C1512.55,-189.37 1505.28,-180.28 1498.27,-171.52\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1501.02,-169.36 1492.04,-163.74 1495.56,-173.74 1501.02,-169.36\"/>\n",
       "</g>\n",
       "<!-- 21 -->\n",
       "<g id=\"node22\" class=\"node\">\n",
       "<title>21</title>\n",
       "<polygon fill=\"#e89050\" stroke=\"black\" points=\"1707.88,-162.25 1554.62,-162.25 1554.62,-91.25 1707.88,-91.25 1707.88,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1631.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">browse_days &lt;= 0.064</text>\n",
       "<text text-anchor=\"middle\" x=\"1631.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 12240</text>\n",
       "<text text-anchor=\"middle\" x=\"1631.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [10964, 1276]</text>\n",
       "<text text-anchor=\"middle\" x=\"1631.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;21 -->\n",
       "<g id=\"edge21\" class=\"edge\">\n",
       "<title>17&#45;&gt;21</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1575.22,-197.79C1581.95,-189.37 1589.22,-180.28 1596.23,-171.52\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1598.94,-173.74 1602.46,-163.74 1593.48,-169.36 1598.94,-173.74\"/>\n",
       "</g>\n",
       "<!-- 19 -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>19</title>\n",
       "<polygon fill=\"#e78c4a\" stroke=\"black\" points=\"1388.5,-55.25 1242,-55.25 1242,0 1388.5,0 1388.5,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1315.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 14088</text>\n",
       "<text text-anchor=\"middle\" x=\"1315.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [12990, 1098]</text>\n",
       "<text text-anchor=\"middle\" x=\"1315.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 18&#45;&gt;19 -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>18&#45;&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1410.24,-90.96C1395.68,-81.4 1379.93,-71.07 1365.53,-61.62\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1367.83,-58.95 1357.55,-56.39 1363.99,-64.8 1367.83,-58.95\"/>\n",
       "</g>\n",
       "<!-- 20 -->\n",
       "<g id=\"node21\" class=\"node\">\n",
       "<title>20</title>\n",
       "<polygon fill=\"#e88e4e\" stroke=\"black\" points=\"1538,-55.25 1406.5,-55.25 1406.5,0 1538,0 1538,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1472.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3508</text>\n",
       "<text text-anchor=\"middle\" x=\"1472.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [3171, 337]</text>\n",
       "<text text-anchor=\"middle\" x=\"1472.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 18&#45;&gt;20 -->\n",
       "<g id=\"edge20\" class=\"edge\">\n",
       "<title>18&#45;&gt;20</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1466.47,-90.96C1467.2,-83.13 1467.97,-74.79 1468.71,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1472.18,-67.34 1469.61,-57.06 1465.21,-66.7 1472.18,-67.34\"/>\n",
       "</g>\n",
       "<!-- 22 -->\n",
       "<g id=\"node23\" class=\"node\">\n",
       "<title>22</title>\n",
       "<polygon fill=\"#e88f4f\" stroke=\"black\" points=\"1688,-55.25 1556.5,-55.25 1556.5,0 1688,0 1688,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1622.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 9817</text>\n",
       "<text text-anchor=\"middle\" x=\"1622.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [8844, 973]</text>\n",
       "<text text-anchor=\"middle\" x=\"1622.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 21&#45;&gt;22 -->\n",
       "<g id=\"edge22\" class=\"edge\">\n",
       "<title>21&#45;&gt;22</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1628.03,-90.96C1627.3,-83.13 1626.53,-74.79 1625.79,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1629.29,-66.7 1624.89,-57.06 1622.32,-67.34 1629.29,-66.7\"/>\n",
       "</g>\n",
       "<!-- 23 -->\n",
       "<g id=\"node24\" class=\"node\">\n",
       "<title>23</title>\n",
       "<polygon fill=\"#e99355\" stroke=\"black\" points=\"1838,-55.25 1706.5,-55.25 1706.5,0 1838,0 1838,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1772.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 2423</text>\n",
       "<text text-anchor=\"middle\" x=\"1772.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [2120, 303]</text>\n",
       "<text text-anchor=\"middle\" x=\"1772.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 21&#45;&gt;23 -->\n",
       "<g id=\"edge23\" class=\"edge\">\n",
       "<title>21&#45;&gt;23</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1681.76,-90.96C1695.5,-81.5 1710.34,-71.27 1723.95,-61.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1725.66,-64.97 1731.91,-56.41 1721.69,-59.2 1725.66,-64.97\"/>\n",
       "</g>\n",
       "<!-- 25 -->\n",
       "<g id=\"node26\" class=\"node\">\n",
       "<title>25</title>\n",
       "<polygon fill=\"#ea975b\" stroke=\"black\" points=\"2071.38,-162.25 1933.12,-162.25 1933.12,-91.25 2071.38,-91.25 2071.38,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">browse_days &lt;= 0.1</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 4664</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [3972, 692]</text>\n",
       "<text text-anchor=\"middle\" x=\"2002.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 24&#45;&gt;25 -->\n",
       "<g id=\"edge25\" class=\"edge\">\n",
       "<title>24&#45;&gt;25</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2002.25,-197.79C2002.25,-190.17 2002.25,-182 2002.25,-174.02\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2005.75,-174.07 2002.25,-164.07 1998.75,-174.07 2005.75,-174.07\"/>\n",
       "</g>\n",
       "<!-- 28 -->\n",
       "<g id=\"node29\" class=\"node\">\n",
       "<title>28</title>\n",
       "<polygon fill=\"#eda672\" stroke=\"black\" points=\"2311.88,-162.25 2158.62,-162.25 2158.62,-91.25 2311.88,-91.25 2311.88,-162.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-144.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">browse_days &lt;= 0.464</text>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-129.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 1512</text>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-113.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [1172, 340]</text>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-97.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 24&#45;&gt;28 -->\n",
       "<g id=\"edge28\" class=\"edge\">\n",
       "<title>24&#45;&gt;28</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2072.16,-201.25C2096.07,-190.47 2123.13,-178.28 2148.23,-166.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2149.42,-170.27 2157.1,-162.97 2146.54,-163.89 2149.42,-170.27\"/>\n",
       "</g>\n",
       "<!-- 26 -->\n",
       "<g id=\"node27\" class=\"node\">\n",
       "<title>26</title>\n",
       "<polygon fill=\"#e99559\" stroke=\"black\" points=\"2010.25,-55.25 1856.25,-55.25 1856.25,0 2010.25,0 2010.25,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"1933.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 3489</text>\n",
       "<text text-anchor=\"middle\" x=\"1933.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [3003.0, 486.0]</text>\n",
       "<text text-anchor=\"middle\" x=\"1933.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 25&#45;&gt;26 -->\n",
       "<g id=\"edge26\" class=\"edge\">\n",
       "<title>25&#45;&gt;26</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1977.53,-90.96C1971.52,-82.5 1965.08,-73.43 1959.02,-64.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1961.9,-62.91 1953.26,-56.79 1956.2,-66.97 1961.9,-62.91\"/>\n",
       "</g>\n",
       "<!-- 27 -->\n",
       "<g id=\"node28\" class=\"node\">\n",
       "<title>27</title>\n",
       "<polygon fill=\"#eb9c63\" stroke=\"black\" points=\"2152.25,-55.25 2028.25,-55.25 2028.25,0 2152.25,0 2152.25,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2090.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 1175</text>\n",
       "<text text-anchor=\"middle\" x=\"2090.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [969, 206]</text>\n",
       "<text text-anchor=\"middle\" x=\"2090.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 25&#45;&gt;27 -->\n",
       "<g id=\"edge27\" class=\"edge\">\n",
       "<title>25&#45;&gt;27</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2033.77,-90.96C2041.69,-82.22 2050.19,-72.84 2058.13,-64.07\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2060.71,-66.44 2064.83,-56.68 2055.53,-61.74 2060.71,-66.44\"/>\n",
       "</g>\n",
       "<!-- 29 -->\n",
       "<g id=\"node30\" class=\"node\">\n",
       "<title>29</title>\n",
       "<polygon fill=\"#eca470\" stroke=\"black\" points=\"2300.62,-55.25 2169.88,-55.25 2169.88,0 2300.62,0 2300.62,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 1483</text>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [1161, 322]</text>\n",
       "<text text-anchor=\"middle\" x=\"2235.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 0</text>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;29 -->\n",
       "<g id=\"edge29\" class=\"edge\">\n",
       "<title>28&#45;&gt;29</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2235.25,-90.96C2235.25,-83.13 2235.25,-74.79 2235.25,-66.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2238.75,-67.07 2235.25,-57.07 2231.75,-67.07 2238.75,-67.07\"/>\n",
       "</g>\n",
       "<!-- 30 -->\n",
       "<g id=\"node31\" class=\"node\">\n",
       "<title>30</title>\n",
       "<polygon fill=\"#b2d9f5\" stroke=\"black\" points=\"2427.38,-55.25 2319.12,-55.25 2319.12,0 2427.38,0 2427.38,-55.25\"/>\n",
       "<text text-anchor=\"middle\" x=\"2373.25\" y=\"-37.95\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 29</text>\n",
       "<text text-anchor=\"middle\" x=\"2373.25\" y=\"-22.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [11, 18]</text>\n",
       "<text text-anchor=\"middle\" x=\"2373.25\" y=\"-6.45\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = 1</text>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;30 -->\n",
       "<g id=\"edge30\" class=\"edge\">\n",
       "<title>28&#45;&gt;30</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2284.68,-90.96C2298,-81.59 2312.38,-71.47 2325.6,-62.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2327.58,-65.04 2333.75,-56.43 2323.56,-59.32 2327.58,-65.04\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.sources.Source at 0x29bb0456fd0>"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import graphviz\n",
    "with open(\"tree.dot\") as f: \n",
    "    dot_graph = f.read() \n",
    "graphviz.Source(dot_graph)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "66cde2a5-c885-4030-bfb4-b07930e8aa95",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature importances:\n",
      "[0.0277837  0.00617623 0.         0.32857209 0.5884121  0.04905588\n",
      " 0.         0.         0.         0.        ]\n"
     ]
    }
   ],
   "source": [
    "print(\"Feature importances:\\n{}\".format(tree.feature_importances_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "023d90ef-c838-41c4-93b9-d71740dac055",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 10 artists>"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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AOAIgh0AAIAjCHYAAACOINgBAAA4gmAHAADgCIIdAACAIwh2AAAAjiDYAQAAOIJgBwAA4AiCHQAAgCPueLCbMWOG1K9fX+62tWvXSvHixe/6fQEAANKKsxW7unXrys6dOyUjCwgIkIiIiLRuBgAAyCCcDXaBgYESGhqa1s0AAADImMFu5cqV8sADD0hISIjUrl1bDhw44Ds2bdo0uffee237+9//7tv//fffS+XKlSVPnjzSvn17OX/+vO0fOnSoNG3aVB599FHJlSuXtGvXTqKjoxM9dquhWO+wcEJtWb16tZQoUUIKFSokAwcOlLCwMFmyZEmi33vevHlSpkwZX1uioqLifO9ixYpJzpw5pVWrVnLx4kXfMW2f9tmgQYOkYMGCsnv3btt/3333WbVOaXv09fz5833nTZgwQQoXLmzXbNu2rVy5ciXedl29etX65eYNAAC4K1WD3XPPPSedO3eWffv2WcB78803bf+uXbssQG3YsMGO9+3b1/ZHRkZKs2bN5JVXXpGtW7da6Hn++ed911u2bJl06dJF/vnPf9qQpPd6iR27lYTa4vF4pEOHDjJs2DCZM2eOTJ48WVatWiUNGjS45fU2btwoXbt2lXHjxsn27dvl+PHjMmTIEDumQe3ll1+W6dOny549e+Ts2bN23Ztpu48ePWr39AbRLVu2yLlz5+z1jh077HXr1q3t/d69ey10atD76aefLDzPnDkz3raNHj3awqZ306AKAAAc5klFxYsX97z11lueixcvemJiYjxXr171fPLJJ57g4GDPyZMn7TP79u3zeG87atQoT8OGDX3nHz161I4dP37cM2TIEE+dOnV8x/7+9797wsPD7fWtjnmtWbPmD/tu1Rbdp6+1zapgwYKejRs3Jvqdu3Xr5nnxxRd97/fu3etZvXq1vb58+bLn9OnTngsXLnhWrlzpqVWrlueFF17wfVbb17hx4wSvre05fPhwnH2HDh3yZM6c2fPtt996rl+/7tvic+XKFU9UVJRvi4yMtGvqawAAkDHo3+2k/v1O1Yrd7NmzZc2aNVKkSBGrdGl1TN1///1SoEABe501a1bf57ViV7JkSd97PS8oKEiOHDli72+uMOmxkydP+t7f6titJNSWfPny2XDwpk2b5ODBgzacWrp06USv9/vvUK5cOV+V7/Lly9KtWzerxI0aNUoyZ84sMTEx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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.barh(X.columns.tolist(),height=0.5,width=tree.feature_importances_,align=\"center\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3ccb671-bd29-48d3-9ca1-556057c0f6b8",
   "metadata": {},
   "source": [
    "### GaussianNB 模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "2f135664-3cb6-4900-8e2f-7e20615782d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.899\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import make_classification\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.25, random_state=10)\n",
    "# 创建GaussianNB模型\n",
    "model = GaussianNB()\n",
    "# 拟合模型\n",
    "model.fit(X_train, y_train)\n",
    "# 预测\n",
    "y_pred = model.predict(X_test)\n",
    "# 评估模型\n",
    "acc = accuracy_score(y_test, y_pred)\n",
    "print(f'Accuracy: {acc:.3f}') "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "368e1d92-b760-493c-92a5-147c4e28e154",
   "metadata": {},
   "source": [
    "### 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "666641a0-b922-4572-837a-48ba5fc57073",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.9        0.1       ]\n",
      " [0.9572083  0.0427917 ]\n",
      " [0.95346446 0.04653554]\n",
      " ...\n",
      " [0.9        0.1       ]\n",
      " [0.9560216  0.0439784 ]\n",
      " [0.8        0.2       ]]\n",
      "Accuracy on training set: 0.954\n",
      "Accuracy on test set: 0.932\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "forest = RandomForestClassifier(n_estimators=10, random_state=2) \n",
    "forest.fit(X_train, y_train)\n",
    "Predict_proba = forest.predict_proba(X_test)\n",
    "print(Predict_proba[:])\n",
    "print(\"Accuracy on training set: {:.3f}\".format(forest.score(X_train, y_train))) \n",
    "print(\"Accuracy on test set: {:.3f}\".format(forest.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "e66a2b53-bce9-472f-9886-55cf3d0a965d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<BarContainer object of 10 artists>"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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mwEAABzBbNkAy5o1qy0AAACS2St3mzdvlvvvv19y5swpderUkR07dtj6NWvWSLVq1SQsLEzuvfde2blzp61/9tlnJSgoSP79739Lly5d7LGu89q4caPcd999kjt3bmnVqpWcPXvWt+3777+XUqVKSeHChWXgwIESEREhCxcutG3z5s2TChUqyO233y4vvPCCXLp0ybdfyZIlZdmyZTJo0CC54447fG1Mrlt22rRpUq5cOTvmK6+8Ih6Px9brz5deekkKFCggefPmtfN5twEAAGTYcKfBq0mTJhIZGSm7du2SmjVrytNPPy2xsbHy+OOPWzjbt2+f1KtXTwYMGGD7jBs3Tk6fPm1B8P3337fHuk6dOXNGmjZtasu2bdskJiZGXnzxRdum4alDhw4ybNgwmTFjhnzwwQeyfPlyadiwoQXCTp06yVtvvSWrV6+W//znP/KPf/wjXltfe+01OXTokO2rYS85P/zwg3Tr1k3Gjh1r55k6dartq5YsWSKTJk2ywKivW7BggSxdujTB41y+fNneR9wFAAC4LcN2y3799ddWuRo8eLA9HzJkiFXxvBU93aYhTUObhj+VPXt2W0JCQqyqlydPnnjHy5Ilix1HK3oaCDt27GjbTpw4IYcPH5Z27dpZF2p4eLicOnVKypcvL5MnT7ZQ+eijj9prx4wZIw8//LCFRj2O0krgZ5995vd709c+9thj0rx5c3uuwVKrhO3bt7f2q6tXr0r16tUtwAYHJ5zRR44caYEUAABkHhm2chcdHW3dpF4a5tq2bWtBR4NV0aJF5fnnn7fq3PXr15M9nlbWNMTpcTT0PfHEE/Zcu1jz589v69etWyd79+61qmHZsmV97ShdurTvOGXKlJGLFy/avl69evW6ofembdGKnLZDl3fffVcOHjxo2+rXr2/dstqtXLBgQendu7dV6BKiXcHaVu+ibQUAAG7LsJU7HfMWFRXle37+/HmpVauWVfK0mvbzzz9b+Pnmm29k06ZN8fbVAPjncWrFihWTe+65R+bMmWPPdbsGIq3mXbt2zcbwNWvWzB6PGjXKxryp4sWLW/XMSx9rdc27XeXIkeOG3pu2pUePHtKvXz9flU67m73H1y5nDW5Hjx6VRo0ayYcffij9+/f/y3FCQ0NtAQAAmUeGrdzpWLvff//duh610jVixAir0HmDlHbH6sQKDT1/DnJa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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.barh(X.columns.tolist(),height=0.5,width=forest.feature_importances_,align=\"center\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1196c3b-0684-47e8-8bf2-b4154bfeda9f",
   "metadata": {},
   "source": [
    "### 多层感知机"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "cb74175c-2afa-4375-909c-fc421884ae06",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.92041645 0.07958355]\n",
      " [0.957948   0.042052  ]\n",
      " [0.95225265 0.04774735]\n",
      " ...\n",
      " [0.95455941 0.04544059]\n",
      " [0.95631084 0.04368916]\n",
      " [0.92064404 0.07935596]]\n",
      "0.938512021589794\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neural_network import MLPClassifier\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "mlp = MLPClassifier(solver='lbfgs', activation='relu',alpha=0.1,random_state=0,hidden_layer_sizes=[10,10]).fit(X_train, y_train)\n",
    "Predict = mlp.predict(X_test)\n",
    "Predict_proba = mlp.predict_proba(X_test)\n",
    "print(Predict_proba[:])\n",
    "Score = accuracy_score(y_test, Predict)\n",
    "print(Score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "01439c9d-d9c7-49ab-a26c-edfdf9e086c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x29cc034cf50>"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Python\\Lib\\site-packages\\IPython\\core\\events.py:82: UserWarning: Glyph 8722 (\\N{MINUS SIGN}) missing from font(s) SimHei.\n",
      "  func(*args, **kwargs)\n",
      "E:\\Python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 8722 (\\N{MINUS SIGN}) missing from font(s) SimHei.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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4sQJz6Su6KFURUREWGBz0+BXuHBhOXDggCeYate+hkWtWh46dMg+A6UVzWXLltnrGzZsaJ+R0tdrN7x24+v28ssv2/G8OXLkiLXZTcOomw4j6Nq1q9x6660ybNgwSZcunSdwp0+f3rr2//Of/1iFVt+/BlSl723ChAkWODVwP/3003L69Ok426BBVscUR98AAIBvWC4qGYKphjz3puMtNdQsWbLEupudSoOju0v78OHDFuDy5Mlj993LXkWnQdA92Utp5VH30/eswVS78bVbv0yZMja0QVcl0CB46dIlC70//PCDBV8do6rjWFWRIkWkWbNmsnHjRts2bdpkr/NGx5bqud2ih1mt5J49e9bCq/4M3MHTTceOajDVLn3t2ndXuvV41atXt8C6b98+a6uOYwUAAEhVwTQ22n2tXcpOpRVQHc+pIWzIkCHStGlTC5Jx0S768+fP22v3798vvXv3thBao0YNC7Q6USh//vxWbdTxme5ufA2lOjls+vTpNsFKw7C7K79NmzayYsUKq7ZqBfLDDz+0saje6LhXPd7PP/9sXe462clN26gBWYcVaMVaJ2+5A7hq0KCBXLx40cadakh10yqujqHV9Wj1GO62AwAApKpgqt3T9957r2fT8FOyZEmrDjqVBsqVK1faBCh3UIuPzt7XSVF64QCdRa9VSh2j6R4OoFVTnSGvNLC6g6l2cWtX/ttvv21d7jpWdfz48fac3te1XnWsplZYdVLVzJkzvba9VatW0q1bN5s4pcMO9F+3F154waq52pbPP//cxp9qNdZNK8O6v4531c/ATUOpHlMnQ+m+Gma9jXUFAABJxKx8r0Jc0UtsCXDz7G3tHtbxlBpS45oUhcDT8adaSdWQrJXdd955x2/H1slPOi632uy+ki7L3xOpnCJHxriXvUppI0vNFifq+G5fcaqLDS6KE0VF+qWzKVncXtiZvVfbDhQUp3rijvXiRDPX1RInirp8RQ72HmRDyZhz4NvfzVL9h0m68PAkHy/yyhXZPfz1oPwZ+Dwr330FKPiHVnJ16EBsnn32WXnvvfcSddxTp05ZNVTXZ9XKLwAASFn+mrgUEsQVU5+Dqa7xqWtzatf20aNHpUCBAtK6dWt58803Y51IhPjpJKTo3e/RJeVbkFax41s0HwAApIAgDpUpEky1iqcz1kePHu1ZQkmrejrzPfri70gYXYpKl3sCAABI63wOpt9//72sX7/es56mTqrRSUVa+QMAAEAcWGDfK59H8OvVi3755ZcYj+l9fRwAAACxY4H9ZKiYZs6cWdq3b29XDtLLUuraoBpMdfH4Z555xl6jl9oEAAAAkjWY1qpVyzY3nfmt62ICAAAgHnTl+z+YDho0yNddAAAA0jyWi0qGMaZ63XWdRa5XFbp5AwAAAAJWMe3evbtd413Hk4aFhSX6xAAAAGkKXfn+D6aqa9euUrJkycTsCgAAkDYRTP3fla/XXu/Vq5ecPHnS110BAAAA/1VMp0+fLlu3bpVixYrJ7bffHuOymUuXLvX1cAAAAGkCk5+SIZh27NjR110QpI6fzCahl8LFSY65cohTTct1tzjR6cqR4lQZHPof33y5z4lTPXDL7+JEW3YWEaeqkmW/ONHMkP9fmtFRQlK6AakYXfn+D6YdOnTwdRcAAAAgeSY/AQAAwEdUTL0imAIAAAQAY0z9FExz5colISHeB5WcOnUqIYcDAAAAEhdM9WpPAAAASAK68v0TTOvXr5+QlwEAAMBhXfkjRoyQhQsXen3diRMn5Ntvv7VLz6cUxpgCAAAEsQIFCsjy5ct97iHftWuX1KxZ06ehmrNnz5aXXnpJrl+/LqNGjZK2bdv61FaCKQAAQCCkoq78PXv2SJMmTeT06dMJ3kcvwNSuXTv5+OOPpVatWtKyZUupVq2alCtXLvkuSQoAAIAkBFN/bMmsWbNm8uyzz/q0z6RJk6Rhw4bSpUsXqVixovTs2VOmTZvm0zEIpgAAAKnQuXPnYmxXr17127F1rGnr1q192mfTpk1y7733eu7rMID169f7dAyCKQAAQACE+HFTRYsWlRw5cni24cOHi7+UKFHC5300HEffL3v27HL48GGfjsEYUwAAgFQ4xjQiIsLCn1vGjBklJaVPnz5GG8LDw+XSpUu+HSMZ2gUAAIBklj179hjBNKXlzp1bjh8/7rl//vx5CQsL8+kYdOU7iC7lENfaYfE9F5vJkydLgwYN/Ng6AADgj3VM/bE5UY0aNWT16tWe+xs2bJDChQv7dAyCaSpRt25d2bx5c0o3AwAApIFZ+fE5c+aMREZG/uPxVq1ayaxZs2TLli1y4cIFGTt2rDRq1Eh8QTBNJXTchpPK9QAAIG3KlSuXhc+bVa5cWfr06SPVq1e3Smm6dOmkR48ePh07zQdTXQxWq5E6m00Xkj148KCn23zevHlSvHhxGzPx0UcfefZZt26dLRyr++jisWfPnk3QuZYsWSKVKlWSbNmyyUMPPWTnSqi4uvITcsyjR49KyZIlZcqUKZ7HxowZI4UKFbL9nnjiCbly5UqC2wIAABIpBaql58+ft+F93rZ33nnHCmFumjtcrn+eUB+rUqVKrOfSY2gXvl4B6ueff5ZMmTL51NY0HUy1zPzggw/KAw88YN3kuuxCixYtJCoqSk6ePCnvvvuufP/99/LWW2/Z5bU0vGn5WgOgbrqPLo2gz3mzd+9eW6z2hRdekO3bt1v1UxeeTYqEHFNnwz388MO22G2HDh3ssT/++EP69etn5fbffvvNLjkWPbTeTNdFu3mtNAAAkDrGmPbq1csKXN42LbwVKVIkye+zfPnylq18nfgkaX1W/vz5861iOGjQILv/wQcfSN68eWXt2rUWWseNGycVKlSQMmXK2A9VK48rV66UDBky2D4hISHy8ssvS/v27b2ea+bMmXLPPffIM888Y/f1+rEbN25MUvu9HVPHf7Rp08ZC9uuvv+553L2Uw7Vr12y9sTVr1sR7Hl0XbciQIUlqKwAAgDdpumKq639FXwhW19vSMRHa7a3jJ7SLXLkTv5autatcl0LQ53PmzCmPP/643ffWFa7n0uO66TcSrWQmtf3xHXPVqlX2b+bMmWXu3Lmex/U9T5gwQfr3729B/Omnn473Wrj6Oh2u4N70vAAAIG1OfkpOaTqYFitWzLrDo3dZ6xUK9LG4Jhpp+LvzzjutMqmbXn5Lx1JoFTU+Okxg3759nvt//vmnVK1a1YYNJJa3Y5YqVUq+/PJLGTx4sIVL9ww6fY86MFlL9rr/iRMnZOjQoXGeRyus7rXSnLZmGgAAqUWwLxflD2k6mGp1UQcEazf1/v37pXfv3tZtr+twxaVp06Zy4MAB6+7XAb06uLdx48axDg6Orm3btvLTTz/Z+qJacXz77bclX758Ehqa+B+Bt2Nq9VfbqMs3aNX3888/90z40rG1WlHV969u3LiR6HYAAAD4Q5oOplmzZpVFixbJ4sWLpWLFihY4tcs7vrCo3fc6W1/Hc2o3+tdff233o89ii412n+uxR48ebeNWdRKVOygmVkKPqWNhdQKXVk4vX75sobRbt27y2GOPSdmyZS1UDxgwIEltAQAAXtCV71WIy1upD7iJzsrXpbKKTnhTQjOFi6O4QsSpWlX6TZxo9tq4ewhSWoaczlzGLG/OC+JUbYquFycavfqBlG5CnN6t97U40av/fVycKOryFTnYa5DNOWBol29/Nys9M0zShSX972bktSuy+V+vB+XPIE1XTP1Jq61aTY1t05nxAAAAiF+aXi7Kn3Sx+riWf9JZ8QAAII3zVze8S4IWwdRPdIxpbFdmAgAAMARTr+jKBwAAgCNQMQUAAAgAf61BGhLEFVOCKQAAQCDQle8VXfkAAABwBCqmAAAAARDictnmj+MEK4IpAABAINCV7xVd+QAAAHAEKqYAAAABwKx87wimAAAAgUBXvld05QMAAMARqJgi0cbUmiVZsqUTJxl78H5xqlY5fxUn2nl7PnGqmrn2iRNNXF1PnGr8xbriSOmcW+IZ+WcjcaRQh35mTm1XKkBXvncEUwAAgECgK98ruvIBAADgCFRMAQAAAoCufO8IpgAAAIFAV75XdOUDAADAEaiYAgAABEgwd8P7A8EUAAAgEFyuvzd/HCdI0ZUPAAAAR6BiCgAAEADMyveOYAoAABAIzMr3iq58AAAAOAIVUwAAgAAIifp788dxghXBFAAAIBDoyveKrnwAAAA4QqoIppMnT5YGDRoE/LzLly+XW2+9NeDnBQAAwTsr3x9bsEoVwTSl1K1bVzZv3iypWUhIiOzbty+lmwEAANwL7PtjC1IE03ikT59esmfPntLNAAAASBMcF0x//PFHKV++vGTOnFlq164tu3bt8jw3ceJEyZ8/v23/+c9/PI//9NNPUqVKFcmVK5c8+eSTcubMGXt88ODB8tBDD0n9+vUlR44c0qZNGzl37pzX5+LryncPK4irLUuXLpUSJUpIwYIFpV+/flK0aFGZN2+e1/c9c+ZMKVOmjKctZ8+ejfG+ixUrJtmyZZOWLVvKhQsXPM9p+/Qz69+/vxQoUEC2bdtmj992221WLVXaHr09a9Ysz35jxoyRQoUK2TGfeOIJuXLlSpxtu3r1qn020TcAAOAbuvJTYTB96qmnpFOnTrJjxw4LqAMHDrTHt27dagFw1apV9vwLL7xgj0dEREiTJk3k+eefl/Xr11to69ixo+d4CxculM6dO8uvv/5qXdru43l7Lj5xtcXlcsnTTz8tQ4YMkenTp8snn3wiS5YskYYNG8Z7vJ9//lm6dOkio0aNko0bN8qRI0dk0KBB9pwGzeeee04mTZok27dvl5MnT9pxo9N2Hzx40M7pDtLr1q2T06dP2+1NmzbZ7VatWtn9P/74w0KzBtXffvvNwv+UKVPibN/w4cMtMLs3DdsAACCRs/L9sQUpxwXTTJkyyfXr1yV37tzy6aefegLTxYsX7Xbp0qXlmWeesUCqvvjiC6usdu3aVUqWLCnjxo2TuXPnyl9//WXP16lTR9q3b2/VyFdffdWec4vvufjE1Zbjx4/L4cOHreJ577332jAADZJalYyPVmE1kDdv3tyqm/q+W7RoYc+VKlXK3ou+xz///NM+Gw3t0WlYnDZtmtx3332SJUsWe0zPmTNnTrut7dDbGTJksPsZM2a0f69du2bnW7NmjQX0uGg1Viu47s39fgEAAII6mGrQXLZsmRQuXNgqjVqdVLfffrvky5fPboeFhXleryFJA6mb7qfB68CBA3Y/enVPnzt69KjnfnzPxSeutuTJk8eGE6xevVp2795tIU7Dqzc3v4dy5cp5qqyXL1+20K2V0GHDhkm6dOkkMjIyxv69evUSX2gYnTBhggXOvHnzWpXXXV2NjX6eGm6jbwAAwDd05aeyYHrp0iW5ceOG/PDDD3LixAmbFe/ulo8rDOnYyz179njua8VSx0QWL17c7kefka4BUMdhusX3XHziaou2vWrVqja0QIchvPPOOxb8vNGAHL0tGsx1/Kv64IMPLOBq974OC7j77rv/sb+7ShobHVuqQwyi08+oevXq1t2v59XPeujQoV7bCQAAkoBZ+akrmGqwa9SokY2VPHbsmAUqfSw+7dq1szGaOkFo7969Nh7zkUcesUlJ6pdffrFu9507d8q7777rGWfp7bnE0ECpE690zKpWbPv27Zug/XScqnbFf/vtt/YedEynBm51/vx5iYqKsmECM2bMsKEKNwfN+OhQgAULFsihQ4dskpjSKvSDDz5oY2T1+Mrb5wwAAJCmgqlWIrUr/+2337ZANX/+fBk/frzXauN3330nH3/8sVUrdTb/559/7nm+WbNmNnGoWrVqdkz3pCJvzyWGjlnVQK2VXp2Vr+8nIZVIrYJqsNYgq23Ryu3IkSPtOZ1YpRXgsmXL2vvSsaA6QSqhNMjqpCp3973SUNqtWzd57LHH7LgadAcMGJCEdw4AALyhK9+7EJcv5bdURpeE0q5qnVzky3OJ5Z4dr134OvZUu9579OhhE6CCiS4XpROuZm8sK1mypRMnGXvwfnGqAcW+FScaEdFEnKpmLmdeHGLi6nriVJlvuSROdOlcuDjVLXn/7jlymhNHnTmeP+ryFTn4/GAbZsacA9/+bt7d+C1JnyHp/1+4cf2KrF74ZlD+DBxVMU3tdCb977//blVInUyllV+t5K5cudJmxce2vfLKKyndbAAAAEdIL0FMq6KJeS6xdEKRjlu9mS5eH1f3e7B90wEAALHzVzd8SND2dQd5MHWK8PDwf1xBCgAApDFRrr83fxwnSNGVDwAAAEegYgoAABAI/rqcqEuCFhVTAAAAOAIVUwAAgAAI8dPEpRAJXgRTAACAQPDX5URdwduXT1c+AAAAHIGKKQAAQACwjql3BFMAAIAgnpU/YsQIWbhwodfXnThxQr799tsUXXudYAoAABDEChQoIMuXL/f6um+++SbG/V27dknNmjXl1KlTCT5XpUqVZMuWLZ77nTt3lkmTJiV4f4IpAABAAIS4XLb54zjJbc+ePdKkSRM5ffp0gve5dOmS7N69W44dOyYZMmSwxzJmzOjTeQmmSLQBvz8i6TL79guX3PJkuSRO1XZZN3GiBhV2iFP9cTG/OFHWfBfFqUrlPilOtOl0UXGqGvkPiBM9WG6rONGl85HydEo3IrWK+r/NH8dJZs2aNZNnn31W+vXrl+B9NmzYYBXTvHnzJvq8zMoHAABIhc6dOxdju3r1qt+OrWNNW7du7dM+a9eulYMHD1owzZkzpzz33HM+t4lgCgAAEMCufH9sqmjRopIjRw7PNnz4cPGXEiVK+LzPjh07pG7durJy5UpZtGiR/PDDDzJmzBifjkFXPgAAQCqclR8RESHZs2f3POzreE5/Gz9+fIz7b775powdO1Zee+21BB+DYAoAAJAKZc+ePUYwdZp8+fLJoUOHfNqHrnwAAIBAXpLUH5sD3X333VbFdVu9erUUL17cp2MQTAEAAAJ45Sd/bCnpzJkzEhkZ+Y/HK1SoIN26dZM1a9bIlClTZNSoUTYByhcEUwAAACRYrly5Yiyi7/b+++/bONeGDRvKoEGDZOTIkdKhQ4eEH5gxpgAAAAHir254l2/HOH/+vDRo0MDr6y5evChz5szx3NdLk7piOVdsjyldIir6/olBMAUAAAiAkKi/N38cxxe9evWyLTWgKx8AAACOQMUUAAAgiLvyUxOCKQAAQCpcYD8Y0ZUPAAAAR0izwXT58uU22yy1mDx5coJm1AEAAGeK67r3idmCVZoNpk4UEhIi+/bti/W5J598Ur799tuAtwkAAPhJkF/5yR8YY5pKhIWF2QYAABCsQp3WXV2zZk1p0aKF5MiRQxo3bixHjhyJtds9enWxY8eOMnjwYPniiy+kXLlyMm7cOM/rNmzYYNduzZo1q9SpU0e2bdsW4zjz5s2z67jmzp1bPvroI8/jq1atkqpVq0rmzJmtTdu3b/c89+OPP0r58uXtudq1a8uuXbs8zy1cuFAqVqxoi8x26dJFrl696vV933bbbfZ+VIkSJez2rFmzvHbl6+t0XTJ9b8OGDZPq1atLkSJFZP/+/fb81KlTpUyZMnLLLbfI66+/7lkQV/995ZVXJG/evHb1hp49e8a5WC4AAPAT/VMb5YfNJUHLUcFUrVu3zoLkxo0b7bJW3bt3T9B+ixYtsmCpl8Nq3ry5PXb27FkLt02bNpUdO3ZIjRo1pF27dp59Tp48Ke+++658//338tZbb8lLL70kV65ckaioKGndurW0bNlS9uzZI/Xq1ZOXX37Zs99TTz0lnTp1smNqQB04cKA9rgFVQ3WfPn3sfaxdu9Yux5WQ93z69Gm7vWnTJrvdqlWrBL1vDccvvviiBXN9/1myZJGVK1fKTz/9ZMF49OjRsmTJErtm7fTp0z2f1cSJEy1g6+vmzp0rixcvjvMcGq7PnTsXYwMAAL5hjGkq7MrXit+rr75q1UANWxomE3K1gt27d8vOnTut0ur23XffWUVwwIABdl+v26qh1+3ChQtWXa1QoYJVFvU8R48elaJFi1qlVffdvHmznDlzxkKoW6ZMmeT69etWZf3000/lxo0b9viXX34pVapUsUCoevToIf/61788549LtmzZPLezZ89u1daE0oD8yy+/SLVq1eSuu+6SggULWtumTZsmjz76qDRr1sxe9/TTT1t1WEO1tl/p63Q/Dd+hoXF/Rxk+fLgMGTIkwW0CAAAIioqpBlN3t3bhwoUlMjLSKpvRXbp06R/7dejQIUYoVREREdY17qZB84knnohxv1KlSnbbPX5Tu7Q1pI0ZM8bO//zzz1sFU9vhpkMGli1bZs83bNhQtm7dao8fPHjQAq0GS920ynrgwAFJTuHh4TH+ddO2aCXU3ZaxY8d62lK/fn3rytdQmy9fPundu3e8Qw769+9v1Wf3pp8rAABIzDqm/pj8JEHLccFUw5N7vKMGoPTp00uBAgWse91t/fr1/9hPu7BvppXP6LPctUJ6xx13yF9//eWpTsZGx7ROmjTJxpVqd3znzp1jhGKtkP7www9y4sQJqVu3ro1xdYdqrVDqMATdtFteX5dQGsj9NdZT29KtW7cYbdHufKUVUh2msGXLFgvVOp52/PjxcR5Lh1ToZxV9AwAAPmJWfuoLpocPH7au471791r3sY7Z1MqkToLSST0aDLVLPiF0bOmpU6fseFpBfPvtt63ymT9//nj3O3/+vP2rXfga2nQMpzswaiht1KiRjdc8duyYPe7uym/Tpo2sWLHChhRomPvwww+tKplQpUqVkgULFsihQ4ds7GdStG/f3iqmGsI13L/xxhu2KR1bqt38Wt29fPmy530BAACkJMcFUx0nqVVKrWxeu3bNJvSULl3aJhTprHqtUOrthNCufZ0lr2Mrb7/9dhuLOWfOHM9QgbjohCnddPylTr7q2rWrBWYdf6rVQu3K15CrQXL+/PmeaqPe15nwGmS1zTo+debMmQl+7zreddSoUTb8YMKECZIU99xzjwV7HVuq710/y08++cSe07Cs3fkasHUog46v1fGwAAAgGUX5cQtSIS4HrROkSyLppl3pcC6dla+h/7aZr0i6zBnFSfJk+ef4Y6fYdyCvOFGDCv8/sc9pIl3xf4lMKRv+KiJOVSp3zDH5TrFpZ1Fxqocq/z1PwGkezOnMdl06HylPV91icw4Y2uXb38377nhF0qdL+t/NG5FXZcnW94LyZ+C4imkw0uWb3JOQbt50EhIAAAActlyUTiJyTyQKJrrwvU5Aik2wfdMBAABx8NfEJZdjOruDO5gGK13K6eYrVwEAgDSGYOoVXfkAAABwBCqmAAAAgUDF1CuCKQAAQCDoMk/+WGwkSoIWXfkAAABwBCqmAAAAARDictnmj+MEK4IpAABAIDDG1Cu68gEAAOAIVEwBAAACIcql/fD+OU6QIpgCAAAEAl35XtGVDwAAAEegYoqgUj3PAXGqA0dzixOFhd4Qp/rlsDMv5Xv1SgZxqqwZroojXXNuHaRe9h3iRC8ubCdOFHX5iohsSelmpFJ+qphK8FZMCaYAAACBQFe+V879CgsAAIA0hYopAABAINhsemblx4dgCgAAEAiuqL83fxwnSNGVDwAAAEegYgoAABAITH7yimAKAAAQCIwx9YqufAAAADgCFVMAAIBAoCvfK4IpAABAIFhPvj+CqQQtuvIBAADgCFRMAQAAAoGufK8IpgAAAIEQpQvjR/npOMGJrnwAAACk7WB6/vx5efjhhyVz5sySL18+WbdunTjNvn37JCQkRJxg+fLlcuutt6Z0MwAAQFK78v2xBakUC6aTJ0+WI0eOyO7du+W///2vFCtWTJxG23T69OlYn2vQoIG9B3/S4KkBNDZ169aVzZs3+/V8AAAggAimzh1jevLkSalYsaIULFjQNicKDQ2VnDlzihOkT59esmfPntLNAAAACJ6K6axZs6x7fMiQITJlyhS7fdttt9lzq1atkqpVq1r3fs2aNWX79u32+IwZM6xi6HbmzBkJDw+X48eP2/2tW7fa8zly5JAmTZrIwYMH4+z+1vNpF73q2LGjDB48WL744gspV66cjBs3zmtXfvfu3e0xrfJ26tTJbutjbjokoVatWtaWli1bytmzZ71+Jo0bN7bj7N+/Xxo2bGi3R4wYEeM1sb0Xva/n1nO99NJL8tBDD0mePHk8wyIWLlxo4V/DdZcuXeTq1auefceMGSOFChWSbNmyyRNPPCFXrlyJs32637lz52JsAAAgEZcS9dcWpAIeTFu1amXd46+++qq0bdvWbmuQioqKktatW1uY27Nnj9SrV09efvll20fHom7YsMECqfrhhx+kdu3akjdvXrlw4YI8+OCD8sADD1hXd9GiRaVFixZ2vIRYtGiRfPTRR/L+++9L8+bNvb5eA522uU6dOvLxxx/bbX1Mafs0HOqmbdEAp4HRm3//+992HG37/Pnz7Xbfvn0T1H49x8iRI2X06NEWUqtUqSKLFy+WXbt22efQp08f+3zXrl1rr1N//PGH9OvXz74k/Pbbb/Za/ZIQl+HDh1v4dW/aTgAA4BuXK8pvW7AKeFd+hgwZrIKnFc+wsDBPV7kGSQ2fuXLlslCnIW/Hjh32nHZhayVRA+ljjz1mlUANuEqDnFb9Bg0aZPc/+OADC6waxBJCx7ju3LnTAldCZMqUyTbtWtfKbvSu/u+++87en7ZFq54arNu3b+/1mFmyZPEMHciaNatPwwf0+PpZ5s+f34LonDlz5Pr16/Lll19aSNVKqerRo4f861//kgEDBkjGjBntsWvXrkmJEiVkzZo18Z6jf//+8uKLL8YIw4RTAAAQtOuYaijTyuNnn30mJUuWtOATGRnpeV6rqQsWLLBgqgH17bfftscjIiIsXLlpSCtcuLAcOHDAZvtHd+nSpX+ct0OHDgkOpd7oEAIdXqDh2h22dfUB7SbXdiUH93FvPr62RYO+O+TeuHHDQq/Sz2vChAkWOLVaqkMJxo4da4E+Nhpk3WEWAAAkkstP3fAuuvKTnY6hnDRpko0r1Wpn586dYzyv3exLliyRLVu22Gx594Qpvb13794Y4yEPHz4sxYsXt6pl9C799evXx1mtTEyQdt30i1GkSBG58847ZePGjbZt2rTJwqFWURN7zMTStjRr1ixGWzTQK/18qlevbl38Oo72xIkTMnToUL+cFwAAxIFZ+aknmGplUWkXvk6C0q7j6CEtd+7cNklKxztq9dRNx5/qvjqZSicP9e7dW8qUKSM1atSwyqkuSaWPa7XU3d3vD6VKlZKlS5fa8X/88Uer7jZt2tQqtRqstbt/9uzZVo1MaNjUY+r4UD2mhvCkaNOmjaxYscKGKWi188MPP7TJWu7JYjouVz9n9+euFVUAAICU5JhgqgFOt2rVqtkknq5du1pl7+jRo57X6LjSmTNn2gQpN+2e1glMGuh0BroGw7lz51r1sXTp0jb5Rycq6ax9ve0vOlZTx6dqZVbbq5VZ7TafN2+ejBo1yoYjfP3113Zfx6MmhE5O0nGqWgXW1QKSQkPu1KlTLeDr56DjdvWzUxpKu3XrZsMiypYta8FZ3w8AAEhG2ovrry1Ihbj81XeMNEMnP+m43NtmviLpMjtr7GmjYn+IU/1nexVxovvLOvcz++WwM692dvlymDhVzeL7xYlWbSwrTjX8vq/FiV5f/Lg4UdTlKxLRb6Ath8j62r793bwv65OSPiTp//244bomSy7MCMqfgWMqpsFMq7haTY1t0y53AAAAOGhWfjDThex1AlJsdMkpAAAQ/FxRUeIKSXo3vMvHdUz1oj261KY3Ohn622+//ccFfQKJYBoAOsY0JX/IAADAAWz0ZOCXiypQoICtfuTNN99847n96aef2qRxDat6USO9KE9CLiGvE7/14kK6prrOudGLKfmCrnwAAAB4rFy5UgYOHCjTpk2zJTl1OpL7apzx0VV/2rVrZ/vqxPQ333zTc7GkhCKYAgAABEJc171PzJaMdKlJvRDP/fffb+ui63KTui67N7oevV6pU686qSsl9ezZ08KtL+jKBwAACATrgo/yW1f+uXPnkuVKje51z9206qlrxHujF/N56KGHPPdr1qwpb731lk/npmIKAACQChUtWtSWoXJvehEifzt16pRVT3XNdm80KEe/TLwuZaVr0vuCiikAAEAAuKJc4gpJeje86/8qphERETHWMfVHtfRmzz//vE1+il4JjW+yd/Q2hIeH25U3fUEwBQAACARb5skfXflR9o+G0uRcYH/KlCmybNky66JPCL18/PHjxz339bLnYWG+XVCArnwAAADE8Ouvv0qvXr1smaj8+fNLQtSoUUNWr17tua8TpgoXLiy+IJgCAAAEqivfT1tyOnbsmDRr1kxeeeUVqV69uly4cME2tzNnzkhkZOQ/9mvVqpUF2S1bttjrx44dK40aNfLp3ARTAACAQNAueH9tyWjmzJny119/2Xqk2bJl82xuuXLlsvB5s8qVK0ufPn0szGqlNF26dNKjRw+fzs0YUyR60HXkpaviNFcvXBenirp0RZzo2oVr4lRO/B1TUZeT949CUly/6MyfZ9RlZ/7+q0sX/ln5cQKnfmZRV67E+FuAhLsh1/1y4acbehwf6FjPBg0aeH3dxYsXZc6cORYudYtLfD/7d955xxbZP3TokNSvX9/nMaYhLn6z4KODBw/aEhUAgLRLZ4Tr4uvw7sqVK7aMklYh/aVAgQJ2VSad+R5MCKbwWVRUlK1LpmX9kJCQJB1L1zzTkHvzkheIG5+Z7/jMfMdn5ru08plpbNAKXKFChSQ0lBGBvoTTa9f816MRFhYWdKFU0ZUPn+l/iPz9LTm5l7wIRnxmvuMz8x2fme/Swmemi7nDNxoigzFI+htfdQAAAOAIBFMAAAA4AsEUKUovXTZo0KBkuYxasOIz8x2fme/4zHzHZwYkHZOfAAAA4AhUTAEAAOAIBFMAAAA4AsEUAAAAjkAwRYrZunWr1KhRw665269fPy5vlwBz586VkiVLSvr06aVKlSry+++/p3STUpXGjRvL5MmTU7oZqcarr74qzZo1S+lmpAqTJk2yxfUzZ85sl37cs2dPSjcJSJUIpkgRV69etT94d955p/z666+yfft2AoMXu3fvlk6dOsmIESPsGsRly5aVLl26pHSzUo3p06fLokWLUroZqcbmzZvlk08+kQ8++CClm5Iq/r/51ltv2RfHP/74Q0qVKiUdO3ZM6WYBqRLBFCliwYIFcvbsWRk9erT9R3zYsGHy2WefpXSzHE2roxpKH3/8ccmfP78899xzsmHDhpRuVqpw6tQpeemll6RcuXIp3ZRUc9nhZ599Vvr27WsVesRP/3941113SbVq1aRYsWLyzDPPyK5du1K6WUCqRDBFiti0aZP9h1y7vVSlSpWsaoq4PfzwwxYW3Hbs2CFlypRJ0TalFhpKH330Ufudg3fjx4+XLVu2yK233irz5s3z6/W9g1H58uVl6dKlsnHjRvvCrZXmBx54IKWbBaRKBFOkiHPnzkmJEiU890NCQiRdunRy+vTpFG1XaqFBYdSoUdK9e/eUborjLVu2TJYsWSLvvfdeSjclVbhw4YItEq+V0v3798uYMWOkbt26cvny5ZRumqODaevWraVq1aqSM2dOWb16tbz//vsp3SwgVSKYIkXo5J2br44SHh4uly5dSrE2pSYaHLJkycIYUy+uXLki3bp1k3Hjxkm2bNlSujmpwn/+8x+5ePGiBfohQ4bIDz/8IOfPn5dp06aldNMca+3atTJ//nz55Zdf5MyZM9K2bVtp0qQJEzqBRCCYIkXkzp1bjh8/HuMx/eMXFhaWYm1KLbTL8OOPP5YZM2ZIhgwZUro5jjZ06FBb+aFp06Yp3ZRU4+DBgzbk4ZZbbvF8idShNoyZjNvMmTOlTZs2UqtWLcmRI4e8/fbbNiFKhywB8E16H18P+IWGhYkTJ3ru792712bqa2BF3PRz0mqMBlPtPkT8NLzrFyDtXlVakf/qq6+swqXjAPFPRYoU+Ue3vXbp165dO8XalBomi504cSLGl2z9XYuMjEzRdgGpUYiLvgakgBs3bkihQoXk3XfftSWQunbtKn/99Zd1hyF2GhaqV68uderUsdUM3LRLX8foIvbqn/6uub388stWDdSlfNwVQcR08uRJG1+q/9/UCXfata/rmf7555+2Tif+afbs2dKhQwerlOqKGbqmqa5junPnTno1AB9RMUWK0O5B/Y+3Vv90cf3Q0FBZvnx5SjfL0RYvXmwrF+h2c7VZZ08j9upfdFmzZrVASiiNW548eeT777+3EP/iiy9KwYIFrcpMKI1bq1atbDm3//mf/5EjR47IHXfcIXPmzCGUAolAxRQpSquk69evtyqW/kEEAABpF8EUAAAAjsCsfAAAADgCwRQAAACOQDAFAACAIxBMAQAA4AgEUwAAADgCwRRIY4unP/LII7Yof82aNWXz5s0J3lfXmU0N66VOnjxZGjRoIE4wePBgW8w/obTd2v5goO9b3z8A+IJgCqQhenUavUyiXsNbFwVv2bJljCsjBYMnn3xSvv32W3GC1157za+XPg30l4OknE/ft75/APAFwRRII3bt2iULFiywK26VLl3aruxz6tQpWbNmjQSTsLAwu8KTE4SHh0vmzJklLdL3re8fAHxBMAXSiNWrV9s10PVa3ipdunTSp08fT3j46aefpEqVKpIrVy6rOp45c8bnbvN9+/ZJSEiI3dZKW/fu3SVHjhzy0ksvyUMPPWRX91q3bp1nP720qrZHN70mu9vMmTOlRIkSNuSgUaNGcuLEiSR15bu71N966y3JmTOnHXvVqlXxHufo0aN26dzr16/LCy+8YFcnUzVq1JB///vfdnvq1KlSpkwZu8Tp66+/LjdfrySurvxRo0bZZ1GpUiXp3bu3tens2bP23MWLF+Wxxx6z9167dm1rh14hTT/Xhg0byv79++22bvq4t4qnXpb1iSeesHNMmDBBChQoIPXq1ZOoqCirnvfs2VNy584tefPmlYEDB9p+3s7n/jkfP35cHn/8cfu9SkhXvl5+uHHjxnb79OnT9ru2aNGieN8DgLSFYAqkEYcPH5Z8+fLFeGzQoEFy5513SkREhDRp0kSef/55u0TshQsXfBobGZdz587JyJEjZfTo0RZSNfguXrzYntu6dauFUQ2InTp1svCnzp8/b0MOhg8fLtu2bbNwqEEuqfT673v27JENGzZInTp1pH///vG+XsOyfl66z+7duy1gq507d0q1atUsyHfp0sXe25IlS2TKlCkyffp0r+34448/ZMiQIbJ06VILjCtXrpTt27d7qrxDhw6Ve+65x4ZbaFj9+OOPrS0a5ObPn2/XrNfburm/ZMTn0KFD9kVDf85jxoyR7777TlasWGHXdNegOm/ePPnll1/sPYwbN07Wrl2b4PPpUBD9mU6bNk0SQn/ftmzZIsuWLbOf77333mtfPADALb3nFoCgppU/rZLG5osvvrDqXNeuXe2+BhSttGmFTCtsidW+fXuryGqgadGihcyZM8fa4a4MapjT8PfMM8/Iu+++a49rENXt2rVrUrBgQQtOWt1LKj2mBrGMGTNau7p16+Z1n6pVq1oQvXr1qhQuXNgmi4WGhlrFddiwYfLoo49Ks2bN7LVPP/20tfWpp56K95h6jDvuuEMqV65sn41WcQsVKuR5Xn8OWkVV+pnplwatTmrFU8Ornl9vJ1T0z16rvRpQlf4ctK26Xbp0yYKw/n7s2LHDJsYl5Hz6ZcZbwI9Oj6dfMvT9aTD+7bffErwvgLSBiimQRmi4uLl7XruSZ82aZeEneneshjANcAcOHPDpHBpwonMPE4htrOHtt9/uqeDquFC3TJkyWZs+/fRTe7558+bWvqTSrnh9T+7z3dztHlcw3bhxo7Vfu+y1gqiPqYMHD8rcuXPtc9Vt7NixCfq8dHzvn3/+aeN7tVJZvnz5GM9HH4aQ0HbGJ/pnf/PPYe/evdZdr2FVP3MdPqDd+wnlDtC+aN26tYVSPW+xYsV83h9AcCOYAmmEdrlqNUy7ypXOxtdgopVRDQjaZR2921+rhMWLF4/3mFrJi17N1GEACZU9e/ZYH9fAplU+7eLW8ZU6ftPdzZ8UcZ0vPhpCv/nmGwuTGky16ugOpvq5adVVg6tuWnHUCrA3OpZTK4daie7bt6988MEHCW6nVi+TGlSj0zHGOvZXu/t13Kx+1r6cT4Osr/T96uepQxn0cwOA6AimQBqhXcRapXzuuecshA4YMMAqfbVq1ZJ27drJzz//bJORNKzqa3S9U29jGLWyquMjdSypToR57733ktzOY8eOWdVw4cKFFlJVSi1ppSFUw3bZsmUtmOptHV+qdDiAVkx1uIMOE3jjjTds80bHjD744IMWZLXCqhOREkqr2vqlQcfJ6ioL+m9S6JcU7dLX6u+bb75pE9OiB1F/n08nUunQBa2G62f17LPP+mWYBoDgQTAF0gitfukYSA1+OsZRZ2zrhKAMGTLYBBedFKOhScOYLvXz+eefez2mTl7RkFWxYkVp2rSpzUxPqttuu83GIWo4LlWqlFV5dQJVStCxpDrpyR1MlTuY6gQlncSkY0s18OuY2ISsWarrx+okKf1CkC1bNvvsdYhAQmiVVicN3X///TZGVb9MJIWO6509e7YN6dCA/cADD8QIn/4+n64AoF+C9Hy9evWySXb+XOcVQOoX4vJnvxAAIF4aaDWcaUDVSvD7779vyy+5l6ACgLSMiikABJCufPA///M/VinVKuyvv/7qWT8UANI6KqYAAABwBCqmAAAAcASCKQAAAByBYAoAAABHIJgCAADAEQimAAAAcASCKQAAAByBYAoAAABHIJgCAADAEQimAAAAECf4X6Zq9y+yfVPPAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 2000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20, 5))\n",
    "plt.imshow(mlp.coefs_[0], interpolation='none', cmap='viridis')\n",
    "plt.yticks(range(10), X.columns.tolist()) \n",
    "plt.xlabel(\"Columns in weight matrix\") \n",
    "plt.ylabel(\"Input feature\") \n",
    "plt.colorbar()\n",
    "# 显示了连接输入和第一个隐层之间的权重。图中的行对应 10个输入特征，列对应 10个隐单元。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "678bdbc0-ea3e-4164-9496-032e74b32a06",
   "metadata": {},
   "source": [
    "### ExTree模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "id": "ea36d281-6b72-420b-a820-8da0be164012",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型准确率: 0.9320\n",
      "\n",
      "分类报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.94      0.99      0.96     61206\n",
      "         1.0       0.11      0.02      0.03      4010\n",
      "\n",
      "    accuracy                           0.93     65216\n",
      "   macro avg       0.53      0.50      0.50     65216\n",
      "weighted avg       0.89      0.93      0.91     65216\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAN6BJREFUeJzt3Q2Y1WWdP/57ZOSpBAZICCRERFsNrBDEVBSl3C7DFnUTY1dWZTOJsrW4lE0oK0BXw017MAPBfMCK1mVbQ7bSMjdWg5BADI2weMjU5FGUCs7/ur+//5lreGaQzxxm5vW6rnPJOWfOmfu8lXHe3/u+v9+qUqlUSgAAAMBBd9jBf0sAAAAgU7oBAAAgiNINAAAAQZRuAAAACKJ0AwAAQBClGwAAAIIo3QAAABBE6QYAAIAgSjcANIDVq1en6urqtHDhwl2emzRpUjrttNP2+vpvfOMbacaMGWnbtm0h4yuVSmn58uVp06ZNOzyev9+aNWvSyy+/nNavX79ft3Xr1qU//vGP6bXXXtvhvX7zm9+kBx98cI9jWLBgQfFaAGhKqis9AABoDlq1alUU2Hbt2hX385+3b9+eDj/88PTmN7+5KORZfuz1119Pbdq0SVVVVcVjL7zwQho/fnzq27dvGjlyZFq8eHFq3bp1Ouyww3Zbnrdu3Zr69OmT3vSmNxWP5dK8ZMmSogTn24YNG4oSnW9/+MMf0vPPP18U7o0bN6YrrrgiTZs2rfb98vNHH310Mf481vLYN2/enNq3b1/c37JlSzGWPKbyGP785z+nBx54IH3wgx+sfa8f//jHacKECWn48OG1j7366qu14xw4cGCaPXt2uuCCCwL+DQBAZSjdABDonnvuST/96U/TLbfcUtzPZTp79NFH03vf+94dvrZcsrOVK1cWZTcX3FGjRhXF9Lvf/W5Rbk855ZSi4LZo0aIo6Xl2Ohf38v1ceP/3f/839e/fv3ivXOL/5V/+JXXs2DF16tQp1dTUFF937733ps985jNFye3atWtx69Klyw5jOuqoo9Jf//rXHR57/PHH0xlnnFHMamcjRoxIb3/729PnPve5vWbRsmXL4rbz+991111FEc+fqVzcAaCpULoBINCiRYuKmeqd5eXk+fE8g/zNb34zzZkzJ/33f/93MUucS/Jb3vKWonCPHj06PfbYY8XtyCOPLF77l7/8pfZ98ix1r1690ty5c9Ppp5++y/f5/e9/X7xnfr6uFStWFKU7F/+ePXvWPp5nwV955ZXiex933HG1j5988sm7LI2ve5Agu+GGG3Y5aJDl98oHAvJMeZ7Rv/POO9P73//+4vFc3MsHB/IBhfLsfS76+fmcDwA0Zko3AARatmxZUWRvvPHG4v6//du/FSU5zzyXZ73zP3MZ7dChww6v/fd///d09913F7PlucB+/OMfT5MnT05HHHHEfn///Jq8rLu8fL0sz3Rnw4YN22WZei67ecY778Euy+X32muvTdddd136v//7v6I0l/df5yXpeTl7fu65554rlonXndHOy+FPPfXUomxnDz/8cHGwYMCAAcX9uqU/v2/ZlVdeme644479/qwAcChSugEgeKY7z1rn4pvlGet8krF8K5fZvM86z+yWl2vn0pv3Oo8dOzYdc8wx6fzzz0+f/OQni9Ka93QPGjRov79/nkHP8ux5vpWVy3Fe+p4PApTlsty2bdtd3iePMy/9zgcG8lL2rHyQIM9gl58rHxAo7//Ofvvb36a3ve1txfL3LH+Ga665pvi8F154YfrKV75SPN67d+9iP/mQIUOKPMxyA9AUKN0AECQv4X7xxReLk5jlMpv3Uucl5Hkf89ChQ2uLeFl+viwX1Fw8c+GeP39+UUzzMvRcuHORf/rpp9M//MM/7PI98zLuXK7LJ2wry3vK80nMdvbud797h/sf/vCH03333bfb962Pukvgn3nmmWLPd9kHPvCBolBffvnlxWx+3kteXq6eMyjfB4CmwCXDACBI3kudZ6jLe7HryuU7l+r8NeXb7bffns4888xipjsvSS9fauziiy8ulmBfdtllxWN5f/a4ceN2eL98YrNcWnOZzbPKO8sz0e9617uKk67lW3l/dl76XX4sz0DvaXY5F/m8Zzt/j/y9svznfPv2t79d+9zf/M3f7FLSf/GLX6R3vOMdtffz98gHBfJnrnt2cwBoisx0A0CQY489Nt166607PJaLdT7J2G233VYsIS8vuc7yCcxyuc37nXPx7ty5czr33HPTn/70p/TWt751hwJd3g9edxl5Xi6ey+7OZxvP8vfJM+Q77wc/6aSTdrif92fXlS8/ll+br6Fd1+c///n0X//1X+lHP/rRLnvRs/KlyfJlxfJZzfOS9CeffLL2+cGDBxfLzn/9618Xy9lzYc8l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AEBTUb3fX1hdnaZNm5YuueSSNG7cuHTYYYeln/zkJ8VzNTU1xSXA3vnOd+73N77lllvSZZddloYMGVIsLb/55pvTqFGjDuxTAAAAQGMu3dn555+fVqxYkRYuXFhcPqxTp07F46VSaa+vO+uss9Lzzz+/w2P5MmEPPvjggYwZAAAAml7pzrp27ZrOO++8mNEAAABAc9zTDQAAANSP0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAACHSuleunRpGjBgQKqpqUnjxo1LpVJpv17385//PB1//PG7PD579uzUs2fP1K1btzRr1qz6DgcAAACaRuneunVrGjZsWOrfv39asGBBWrZsWZo5c+Y+X7dw4cI0fPjw4vU7F/iRI0emCRMmpHnz5qWJEyem5cuX1/9TAAAAQGMv3XPnzk0bNmxIU6dOTb17906TJ09O06dP3+trXn311XTBBReksWPH7vLctGnT0pAhQ9Lo0aNT3759i6+555576v8pAAAAoLGX7sWLF6dBgwaltm3bFvf79etXzHbvzeGHH14sLT/jjDN2+35nn3127f2BAwcWs+IAAADQ7Er3xo0bU69evWrvV1VVpRYtWqR169bt8TUtW7ZM3bt336/3a9euXVq7du1uvzYvTc9fX/cGAAAATaZ0V1dXp1atWu3wWOvWrdOWLVsO6Jvv/H57e68pU6ak9u3b19569OhxQN8TAAAADsnS3bFjx/TSSy/t8NimTZuK2ewDsfP77e29xo8fX+wnL99WrVp1QN8TAAAADsnSnS8VNn/+/Nr7K1euLJZ95/J8IHZ+v0WLFu1xKXqeEc/Lz+veAAAAoMmU7sGDBxd7qWfMmFHcz2cvHzp0aLGve/369Wnbtm31+uYXXnhheuCBB9KSJUvS5s2b02233ZbOPffc+n0CAAAAaCp7uvNlvvKlvTp37pzmzJmTbrrppuK5mpqaojzXx0knnZSuvvrqdPLJJxcz3Lm8jxkzpn6fAAAAAA5R1fV9wfnnn59WrFhRXNorXz6sU6dOxeOlUmmvrzvrrLPS888/v8vjkyZNSiNHjkxr1qxJZ5555gHvDwcAAIBGX7qzrl27pvPOO++gDeKEE04obgAAANBsl5cDAAAA+0/pBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgEOldC9dujQNGDAg1dTUpHHjxqVSqbTP18yePTv17NkzdevWLc2aNav28fzaDh06pKqqqtrbF7/4xfp/CgAAAGjspXvr1q1p2LBhqX///mnBggVp2bJlaebMmfss6SNHjkwTJkxI8+bNSxMnTkzLly8vnnvuueeK0r1u3braWy7yAAAA0OxK99y5c9OGDRvS1KlTU+/evdPkyZPT9OnT9/qaadOmpSFDhqTRo0envn37prFjx6Z77rmneO4Xv/hFOvXUU4viXb61atXqjX0iAAAAaIyle/HixWnQoEGpbdu2xf1+/foVs937es3ZZ59de3/gwIFp4cKFxZ+ffPLJ4pbL9pFHHpmuv/76/VquDgAAAE2udG/cuDH16tWr9n7eg92iRYtiWfj+vqZdu3Zp7dq1xZ+fffbZYrn6okWL0v3335/uuOOO9O1vf3uPS9vze9W9AQAAwKGsul5fXF29y/Lv1q1bpy1bthQnVtuf15S/vrxcvSwX80984hPFSddGjBixy/tMmTIl3XDDDfUZLgAAADSeme6OHTuml156aYfHNm3alFq2bLnfr9nb1+cl5mvWrNntc+PHjy/2k5dvq1atqs/QAQAA4NAu3flSYfPnz6+9v3LlymLZdy7W+/uavJS8e/fu6bXXXitOrJb/WZa/Ll9abHfybHleml73BgAAAE2mdA8ePLjYSz1jxozifj57+dChQ4t93evXr0/btm3b5TUXXnhheuCBB9KSJUvS5s2b02233ZbOPffc1KZNm9SlS5c0ZsyY4vJjt956a7Gv+6qrrjp4nw4AAAAaS+nO+7PzJcDyZb86d+6c5syZk2666abiubynOxfrnZ100knp6quvTieffHIxw50Lei7a2V133ZV+97vfpdNPPz194xvfKMr5mWeeebA+GwAAADSeE6ll559/flqxYkVx2a98+bBOnToVj+/tUl+TJk1KI0eOLPZr51Jd3tP9tre9LT3yyCNvZPwAAADQdEp31rVr13TeeefV6zUnnHBCcQMAAIDmol7LywEAAID9p3QDAADAobS8HAAONUdf91Clh3DIef7G+m0FAwAOPjPdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQDAABAEKUbAAAAgijdAAAAEETpBgAAgCBKNwAAAARRugEAACCI0g0AAABBlG4AAAAIonQD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V7/6VfEz9pFHHklbtmxJS5cuLYrLP/3TP1V0jI1VvhBQPjB02WWXpfe+971pzpw5e72ULvtv3LhxxYHjfEDokksuKS4zfPfdd6fPfe5zxf/PclnMB+ypn6985StFtscff3xxu+WWW9LRRx+dbrrppmKig4PPJcOaqGOPPTbde++9xbXUdyfPwhxzzDFp7ty5afDgwQ0+vsZqf2db8y8y7L83v/nNxZLcfv361R40+shHPlL8D2DWrFmpTZs2qV27dkX5Zv899dRTxSqXlStXFveff/754n+u+ReWESNGFI8tWrSomOFatWpVhUfbuPz2t78tDhatWbOmWKVR92dtTU1NkX0u3tRfPoCRD1zkv/NdunQpfgbU/dl76623pm9+85tp2bJlFR1nY9O7d+903HHHFQfZ8s/bZ599Nk2aNKn2+eeeey69613vMtt1APIBtry68IgjjihWD+VCs2LFinTBBRcUt/e85z3FASPqL/8M+MEPfpD69+9fTCTl3xPylog+ffoUz+f/nvMs+MaNGys91EYld4A8050PzJe3muSfD+WfwV/84hfTqFGjKjzKpsVMdxOV/6eZl5XuSbm85Nka9l8+qvrkk0+mgQMHFj+M9nSj/r+wtGrVqvb+kCFD0uLFi9NRRx1V/BJoyd6Byb8A5mW6ecY7ywcxrrvuuqJkl+XnHNU+sF9Y/ud//qfIMx/YuOaaa3bIsaqqqqLja8xyduX88t74XBbrygeK8wEk6ifPZucVA/ln6v33359+//vf7/B8PtDRuXPnio2vKcj/3f793/99sTIr/3xo3759uvLKK4t/5uJN/eWfq927dy/+nH8nyDp27Fj7fP5v1gGN+surifL/x8pyH8gHNh5++OHiwGae+c4/KziI8kw3Tc9XvvKVUps2bUpXXXVV6bvf/W5pwYIFpSVLlpQeeeSR0qRJk0rdunUrXXrppZUeZqP08MMPl4477rjShg0bKj2UJuOjH/1o6dRTTy2tXLlyl+e++tWvllq3bl067LDDKjK2xu6iiy4qDR48uLR48eJdnnv00UeL/5avvfbaioytqXj55ZeLn6e9e/cu/ehHPyrV1NSUfve731V6WI1W+/btS7169Sp9+MMfLjK95pprap97/fXXS5dddlnp7LPPrugYG7OnnnqqNHDgwFJVVVXp4osvLt1zzz2lO++8s9SnT5/S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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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5datW44AMSQkRN5880357rvvpGPHjrJ//34pXLiwdOjQQe7fv+++OwYAAEDcCCI186hFNL169ZKqVavKV199ZYLHLl26SOLEic1zcuTIYQpvdu/ebaa0AQAA4grWRLpxTeSJEyfk6tWrprimdevWMmDAAEdW8qeffpLy5ctLunTpTBAJAAAQ11r8uOsQXw8idV3kunXr5KmnnpL+/ftLp06dTFD54MEDyZYtmwwZMsSsjyxRooR77xgAAAAeF+1552vXrsm+ffskc+bMcvjwYXO8++67cv36dTOVrYHk8uXLpUCBAu69YwAAgBjmzdPOHs1Erl27Vho2bCjZs2eXI0eOSKpUqeSjjz6S0NBQ6dOnj9y9e9cU1cyYMcMEmwAAAPBu0QoiK1asaKartRfk5MmTzbmgoCB544035Pjx46Yv5OrVq816yVKlSlGdDQAA4pR4bjx8OojUamtt3bNp0yYZP368LFiwwJxv0qSJ6R8ZFhYmGTJkMOd0jaSunwQAAID3stWLJ3/+/LJw4ULzUZUtW1Y++OADSZQokeM5fn5+pp8kAABAXOHHmkjbbDd0rFChguPz+PHjmyDSokU2SZIkMecBAADgvaLd4kenqbUfpPV51qxZHWOaeezbt6+p0D59+rR77hQAAMBNNBHprkN8PROpgWONGjVMJbZOWet+2WrLli3y0ksvmSltXS+ZPn16d94vAABAjKPFjxuDSC2uCQgIcHmsUqdObaq0e/TowTQ2AACAj7C1JlJb+Vhu375t9tK29O7d23zUvbTbtGkjuXPnjsn7BAAAcBsSkW4OIsPDw13SvilSpIj0nA0bNsj27dtlxYoVj3E7AAAA8MrqbEvChAnNbjWnTp2SHTt2SIMGDcx5bTg+cuTImLxHAAAAt6LFjxurs3X6Wlv4WLTARmnW8eWXXzZ7Zk+ZMkVq1qwp69evf4xbAQAAgNdlInU95A8//GD2xt63b5/kypXLTG8nS5ZMDh8+bMYGDBggFy9elPfff9+9dw0AABCDSES6MYjUtj5VqlSRgwcPyrRp02TdunXStGlT+fnnn802iM8995w8++yz7FYDAADgA6IdRL733nsSGBgoly9fll27dsm4ceNk79690rZtWxNQ6qHu3btnAsnhw4e7874BAAC8sk/k5cuXTdIuX758kjJlSonzQaQ2E9diGj2OHj0qISEh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",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "model = ExtraTreesClassifier(\n",
    "    n_estimators=10,        # 树的数量\n",
    "    max_depth=None,          # 树的最大深度不限制\n",
    "    min_samples_split=2,     # 分裂内部节点所需的最小样本数\n",
    "    random_state=42,\n",
    "    n_jobs=-1                # 使用所有CPU核心\n",
    ")\n",
    "\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 模型预测\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "# 模型评估\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"模型准确率: {accuracy:.4f}\")\n",
    "\n",
    "# 分类报告\n",
    "print(\"\\n分类报告:\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "# 特征重要性可视化\n",
    "importances = model.feature_importances_\n",
    "feature_names = [f\"Feature {i}\" for i in range(X.shape[1])]\n",
    "indices = np.argsort(importances)[::-1]\n",
    "\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.title(\"特征重要性\")\n",
    "plt.bar(range(X.shape[1]), importances[indices])\n",
    "plt.xticks(range(X.shape[1]), feature_names, rotation=90)\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# 混淆矩阵可视化\n",
    "cm = confusion_matrix(y_test, y_pred)\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\", \n",
    "            xticklabels=[\"预测负类\", \"预测正类\"], \n",
    "            yticklabels=[\"实际负类\", \"实际正类\"])\n",
    "plt.xlabel(\"预测标签\")\n",
    "plt.ylabel(\"真实标签\")\n",
    "plt.title(\"混淆矩阵\")\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "330ad71b-6613-4a8c-aaa5-e8cb0b16bea4",
   "metadata": {},
   "source": [
    "### XGbost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "id": "6ca89875-0041-4d2a-90e2-5631995aed97",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分类准确率: 0.9385\n",
      "分类报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "         0.0       0.94      1.00      0.97     61206\n",
      "         1.0       0.50      0.00      0.00      4010\n",
      "\n",
      "    accuracy                           0.94     65216\n",
      "   macro avg       0.72      0.50      0.49     65216\n",
      "weighted avg       0.91      0.94      0.91     65216\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAocAAAHDCAYAAABWNbAFAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZXdJREFUeJzt3Qm4TeX///+3eZ7neSxDUSSEQlISSlI0kCL0Lc3JJ0KUqWiWVKhoLlQkyZxSPuZKmTJFlCnj4az/9bo//7V++xxnooOz13k+rms7Z++199rr3vtY+7Xe932vncHzPM8AAAAAM8t4tjcAAAAAaQfhEAAAAAHCIQAAAAKEQwAAAAQIhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgg3duyZYtlzpzZlixZcsKyp556yho2bJjsOsaMGWPjxo2z48ePn5Zt1PcVrFmzxvbv3x/ndj3f1q1bbdeuXbZnz54UXXbv3m07duywQ4cOxVnX2rVr7dNPP010G3788Uf32NS0atWqRJepXb7Y2Fh799137eeff07RevU6RX7Hw2effWZffvllcH3jxo0nvN/Hjh1zrzGQ3mU+2xsAAGdbtmzZXMjKmzevu67fFUayZMliuXPndsFRdNvhw4ctR44cliFDhuDx27dvtz59+liNGjXslltuseXLl1v27NktY8YTj78VWI4cOWLnnHOO5cqVKwhBK1eudGFNl71797qwp8sff/zhgoxCy759++zOO++0119/PViflpcvX961Qdvrb/8///xj+fLlc9cPHjzotkXb5G/D0aNH7b333rNrr702WNesWbOsX79+1rZt2+C2AwcOBNtZt25d++ijj+z6669Pldd9xowZdvvtt9svv/wSbGskbVv16tXtrbfectv/7LPPWpUqVWzixInJrvuqq66yCy64wF555RX3Xk2aNMly5sxpLVq0cO3v2rWrrVu3zn766Sf3fsp3331nN910k/tZpkyZVGkjEI0IhwDSrbffftvmzp1rzzzzjLvuh4TZs2db8+bN49w3Mgxu2LDBBTI/iHXu3NkFqA8//NCFmHr16rkglilTJhcoVcVSyPSvK5gtXLjQLrroIrcOBc4HHnjAChYsaIUKFbICBQq4+73zzjv2+OOPuzBWvHhxdylWrFic7SpdurSreEVasGCBXXrppa5KKB06dLCqVavagAEDknw9smbN6i7x1//mm2+6wKg2+QHz39q2bZvddtttNnny5ASDoYKjKntDhw4NbnvyySetdevW1r17d7vsssuSXP+oUaPce6jXUVVdvfZ+eO7du7ctXbrUvv322+A9l0aNGtmDDz5o7du3t0WLFsV5z4H0hHAIIN1SQFDVLz51I+t2VePGjh1rU6ZMsc8//9xVnBTkihQpEgRDVaDmzZvnLkWLFnW3x8TEBOtS1a9ChQo2ffp0Fz7i27Rpk1uvlkdSVUvhUAGnXLlywe2qKv7999/uuc8999zg9jp16pzQTRo/3AwcODDRgKvAqvCkKulrr71mV199tbtdAdMPsQq+fjVUgVTL9RqdiocfftiFvAYNGpywTOvt27evNWvWzK644org9pYtW7rtUrVRbVWIjk/dzgqCCtEaEqAqoN4DVUD1Out1VfAbMWKE2/Zff/3VvU6q5MpDDz3kAqsCsaq0QLrkAUA6ddVVV3n169f3evfurcFp3r333uuNHDkyzn1efPFFr3Hjxgk+ftSoUV6GDBm8d955x/vzzz+9e+65x9u3b1+c+2zYsMGte/78+Qmuo02bNl6uXLm8fPnyxbnkyZPHPU4/4y/LnTu3V6lSpTjradCggWvH7t27venTp7vH6nddrr/++mDZ4sWL3bKtW7cGj12yZImXNWtWb/z48V65cuW8tm3ben369PE++eQTd9/ELt27dz+l133z5s1ewYIFvYMHDya4/Omnn/YyZ87sLV++/IRlW7Zs8YoUKeI1atTI27t37wnL9fpkypTJy5s3b/B66bq2V22M/1pmz57dq1mzZpx1LFq0yKtateoptQ0IAyqHANJ15VBVQI21E1X/NFFDF1FlSWMAVSXzu2hV1VIVqmzZsnbPPfdYxYoVrU2bNnb//fe7ipvGHNavXz/F26CqpKgiqYvvt99+c2P81O2tyqNP3b4aOxeftlVdvvnz53dd2KLfRRVBf1mePHmC23zr16937VHFTdQGda+qze3atbOXXnrJ3V6pUiU33rFp06buNTnVquEnn3zixhNGdulGTnpRhfOJJ56wmjVrnrC8VKlS9sUXX7gxhao6fvDBB25cYuQYzMj1fvzxx67bX9VXdbV36tTJHnvsMTcW8fzzz09w+/T+aVyoJsskdh8gzAiHANIldS/++eefbiKIApe6KNV1rDF26sr0A6MvsgtT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v991ryZVqTxVej517fqBUUcHkeME/edMref+448/7PLLLw+uq9vdD4cKhGPGjHGhTxVNdYe/8MILVqRIkQTXpT84P1BG0n+SYyGblRa/fWGbdZce2ia0L3qFuW1C+6JXQm1TkSkxWqaLcomyReR9N2/e7HoXdZtmNavXUz2LF1xwQYq2RUPiJk2aFKxz1apVVqpUqSS3J7ntPatjDlWlUxDzRQ6gPJUJHsWLF3cvsk/9+Sl5Lo0LuOiii2zZsmXuosGdCm8pfeGSosph/FCr51PXbuTzzZw5004XjTXU+APfpk2bgt91u8Y1asylxl9q6r3GJwIAgNR1zTXX2E8//eQmpahQpGKMMoDmOhw6dMhNStGws7Zt27oeVF38DOGPS4yvTZs27nQ3X3/9tVs+fPjwFPWapph3hv32229e5syZvY0bN3oHDhzwmjZtqlfAGzdunFeuXLk499XtGzZsCK7r9/ibvG3bNi9Hjhze66+/7tZdr1694D6JPZfWs3v3bq948eLe+++/723fvt0bPny4V6xYMS8mJiZF7Zg9e/YJ2+u74oorvMcee8xt29dff+1uW7t2rVekSBHvq6++crffd9993kUXXRSnnXoNGjdu7G7TT11PicjH+T788EOvcOHC3sKFC73vvvvOPbd/nxkzZnhFixb1FixY4G3evNltb8+ePb2U2rt3r9vmXbt2eWF09OhRb/Lkye5n2IS5bUL7oleY2ya0L321zeLlF33e1q9f3+WVihUrelOnTnW3a726b/yL/1jljE8//TTB5xg9erSXJUsWr0CBAl6FChVclknp57d+JuWMVw510kYNxNRMHZVU9fu/obF57733npvlqxNJNm/ePEXPpe5dTdrQzCCdc+jDDz901zV549/SRBONadRMIk0w8bt133rrLTd2T9ulMQgac3C6aMKLJpjoaESTW/TTd+WVV7pl7du3dzOZ9Xfsj30EAAD/jj5XI89oohyyaNEiN7xNE0n8b0nRZ7PuG//iP1a9e9ddd12Cz9GjRw936hud81CZQpNf0uU3pETbt6iElX+GdXVHa0Bs2KhEr8G+GtibGsMM0pIwt01oX/QKc9uE9kWvmBC1LZTfkHImaGyeqooJXSJnGp0JOpVNYtui8zkCAACktrM+Wzm1qRT7b6qGmvmsCSMJ0bkIzyRNGklsW9LKt7MAAIBwCV04/Lc05jD+N5+cLTqtTVrZFgAAkD7QrQwAAIAA4RAAAAABwiEAAAAChEMAAAAECIcAAAAIEA4BAAAQIBwCAAAgQDgEAABAgHAIAACAAOEQAAAAAcIhAAAAAoRDAAAABAiHAAAACBAOAQAAECAcAgAAIEA4BAAAQIBwCAAAgADhEAAAAAHCIQAAAAKEQwAAAAQIhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgAAIAA4RAAADh79uyx77//3nbv3n22NwVnEeEQAIB0ZteuXVahQgXbuHFjcNuHH35o5cuXt65du1rp0qXd9eQek5y5c+datWrVrHDhwjZy5MhUbQNOn8yncd1IgP5T6T+X53ln5HGnU70hs+xY5lwWNtkyeTa8rtn5A2bYkeMZLEzC3DahfdErzG1LC+3bOPSaOCGvVatWcULe3r177e6777Z58+ZZzZo1bfz48fbII49Y+/btE31Mcnbu3Glt2rSxhx56yDp27GgdOnSwWrVqWdOmTVO5dUhtVA7NrEmTJu4/wul+DAAAZ5tC2s033xzntn379tlzzz3ngqHUrl3b/vrrryQfk5yJEydayZIlrV+/fnbOOefYE088YW+88UYqtQKnE+EQAIB0ZOzYsdarV684t5UpU8ZuueUW93tMTIyNGjXK2rZtm+RjkrN8+XJXJcyQ4X+V0rp169qSJUtSpQ04vdJ1t3KPHj1szJgxwbiILl26WPfu3e3VV1+1VatWueUrV660hg0b2muvvebGYCT1GFm4cKHdc889tmbNGjv//PNddbF69eqnrQ2JbaesWLHCHelt27bNOnfubNOnT7f/+7//s3vvvdfeffdd+89//mN//vmnNWrUyB3haUxIQo4cOeIukUeYki2jZ5kypZ1u7tSidkX+DJMwt01oX/QKc9vSQvsU+Hz6jPCv62fkMgW6q666yrJmzeo+Q/xlST0mcv2Rt2tyS5UqVYLbcuTI4T6P4j82rYtJoG3RKqVtyOClpUFsZ9ihQ4dc6NE4CoUoXbJly2bHjx+3c88914W+22+/3Z5++mn78ccf7YcffgiCUvzH6I8+NjbWSpUq5cZtdOvWzZ555hn76aefbNq0aadlzOE///yT6HZmzJjRGjRoYNdcc43b1ksvvdSFQwXVzJkzW6FCheytt96y+vXru8CoroQhQ4Yk+NwDBgywgQMHnnD7pEmTLGfOnCfVDgBA2nDddde5YkexYsWC2/QZs27dOnvzzTctX7581rt372Qfk5gRI0a4ySj6DBJ9tt5444328ccfn4bWICUOHjzocovGmObNmzfR+6XryqECnS4KSwo5+fPnd7erqpYnTx7r37+/u/78889bkSJFbPHixS5MJfQY39KlS61AgQLuiEtHTaogni6fffZZktu5bNkyV7lUgDzvvPNs06ZNrrqoUKztP3r0qJUoUcKmTp3qgm1i+vTpYw8++GCcyqG6IAYvzWjHsmSysNGR/aA6sdbvx4x2JDZcA+PD3DahfdErzG1LC+1bNeCqBG9Xt69mKMfXunVrq1q1qisyxP+cS+gxqkjNnDnTmjdvblmyZHG3qTCiQkTLli3ddX0mqpjiX48WMQm0LVr5PX/JSdfhMDGbN292VTpf9uzZXUVQ4UqhKzGq1mmchgbcVqxY0QUoHSmdre2sXLmyLVq0yHUX//bbb0H3tsLte++9Z8OHD3ddzOpWfvHFF902J0T/mXWJTzu4YyGcVRjZvjDOmgx724T2Ra8wt+1sti+xUKPbddEwqc8//9xV+yRXrlxurKD2/fEf6z8mqfVJvXr1XA+Tf13DoPQZFa0BK0sS7Y4WKd1+JqT8/6Eusru2bNmytmHDhuC6upE1TqJcuXKJPkbmzJljr7/+uutKVvXuzjvvPK3bndR2atsUBjWAuHjx4tapUye74IIL3P3+/vtv1yWwYMEC27FjhwuP999//2ndVgBA2qUeJo1Z10WFB41Jv/LKK5PseoysRiU0lk2nsdE4/K+//totV0FC4xkRBTTmML3r2rWrd+utt3rbtm3zZs6c6e3Zs8crUaKEN2DAAG/jxo3eXXfd5dWuXds7fvx4oo85duyYN3XqVK9gwYLemjVrvAULFnhVqlTxypYtG+e5NmzYoER50tuY0OP279+f6Hb+/PPPXsmSJb2VK1d6mzZtivM4LcuePbs3ffp0b+vWrV6nTp28q6++OsXbsnfvXrctu3bt8sLo6NGj3uTJk93PsAlz24T2Ra8wty2ttk/7cX22+L766iuvevXqXp48ebwbbrjB+/PPP5N9jJQrV8778MMPE2zf6NGjvSxZsngFChTwKlSo4G3fvt2LNkfT4Ht3qvzPb/1MCpVDM+vbt68bgKuKm2b+aizhjBkz7KuvvrIaNWq4btopU6a4amFij9GYvRYtWriLzg+l2zQpRZU8VedOh9y5cye6nToKLFq0qDVu3Nh1PasrWdskGkfy7LPPWs+ePa1SpUpuXKTflQAASB+U9SLHDmpM3erVq10lUN+OojHsyT3GnzB57bXXJvgc+tzRZ4zOiKGx+CmZyIKzjzGHZi7gffvtt3FuU9hSOfxkHiP6DxBJZ4aPpP9UpzJBPLHHJbad48aNc+FQk00UdvWfUoOAVdZXN4FmVOsCAMDppAJF5Ph4pH2EwzQg/kwwn8YMJhRAU0KzyTQQWOda1OxkhdmhQ4emaPwIAABIvwiHaYBOOZMQnYT0VGnm8axZs/7FVgEAgPSIcJgGJHSOKQAAgLOBCSkAAAAIEA4BAAAQIBwCAAAgQDgEAABAgHAIAACAAOEQAAAAAcIhAAAAAoRDAAAABAiHAAAACBAOAQAAECAcAgAAIEA4BAAAQIBwCAAAgADhEAAAAAHCIQAAAAKEQwAAAAQIhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgAAIAA4RAAAAABwiEAAAAChEMAAAAECIcAAAAIEA4BAAAQIBwCANKNXbt2WYUKFWzjxo3BbatWrbKLL77YChQoYI888oh5nuduHzBggGXIkOGEy5w5c5J9npdfftmKFStmFStWtG+++ea0tglIbZlTfY0448aPH+8uKdlhpaZ6Q2bZscy5LGyyZfJseF2z8wfMsCPHM1iYhLltQvui1+lo28ah15wQDFu1ahUnGB45csRat25tV111lb333nvWq1cvtz/t0qWLPfbYY3b//fcH9/3999+tefPmVqtWrSSfd8aMGfbwww+79RUpUsRuvfVW+/bbb1OlTcCZQOXwFDVp0sTtQNKCm2++2T7//POzvRkAkKZ16NDB7S8jTZ8+3fbu3WsjR460SpUq2dNPP21vvPGGW5Y9e3bLnz9/cFE1UGExX758ST7P6NGjrXPnznbttddagwYN3M8pU6ac1rYBqYlwGAJZs2a13Llzn+3NAIA0bezYsa4yGGn58uVWv359y5kzp7tes2ZN++mnn0547LZt2+zTTz894fEJ0Tovv/zy4HrdunXtv//9b6q0ATgT0n238tKlS+3uu++2lStX2gUXXGCvvfaanXfeebZw4UK75557bM2aNXb++ee7KmH16tWtR48eNmbMGPfYuXPnuq6H7t2726uvvupu++GHH9zjfvnlF2vWrJmNGzcuOMrUuJM777zTDh8+7LoZ1OWgI9E2bdrYRx99ZI8//rj99ddf7uj2mWeecUetUr58eXv99ddt1qxZbn36qW1Mrlv5rbfeskGDBtnu3bvtrrvusqeeesqNl9F4mt69e7t1HTt2zG655RZ78cUX3bKEqNtFF9++ffvcz2wZPcuU6X9jc8JE7Yr8GSZhbpvQvuh1OtoWExMT53rp0qWD2/RTlz179li5cuXi3DdTpkz2559/ujGIPu2rb7rpJsuWLdsJ641P+8gyZcoE91Pw3Lp1a4LbFBaRr2vYxISobSltQwbPH3mbDqkr4dxzz7V7773XhbwRI0a4gKUjvFKlSrnQ2K1bNxfUdCQ5bdo0O3TokAtKGrei7gldtLPIkSOH28lUrlzZhUOtT0HQD3Z6mbVjGjJkiPupMS4KpiVKlHBBUt3UEydOtKpVq9rtt9/ujmSfe+45t51ah+6ndfvLcuXKlWQ4nDdvnl1xxRX28ccfW9myZa1ly5Y2bNgwF0q//PJL69ixo7t/xowZ3TJto8bcJESDsgcOHHjC7ZMmTQqOtgEgWlx33XXuIF8TRiZMmGDHjx+3O+64I1iufffw4cOtUKFC7rqWd+3a1Z588kkX+pKjLmXtM7Xv9iuJn3zySYL7UeBMOnjwoMstyj958+ZN9H7punL4xRdfuCPDvn37uuv9+/e3Sy65xP2u4KZlK1ascKFPFURRCNQlc+bMLhhpHErk+rJkyeLWoyqcBiR36tTJLdu5c6frllBVUN3AelNUJVQ4VTBT9U47LHn22WfdoOdRo0YF1TxVH99+++0Ut033bdu2rQuhctttt9nUqVNdONT2+0cQtWvXtvXr17uQmJg+ffrYgw8+eMJR8eClGe1YlkwWNqpcDKoTa/1+zGhHYkM26D/EbRPaF71OR9tWDUj4gFeaNm3qwtvq1avdRQfJPvWotGjRwk0mEfXW6ABdvUQpUbx4cXeg73cta1/rT0jRvl2fE2GjNs6cOTOU7YsJUdv8nr/kpOtwuHnzZndKA5/CoLoNRMFMg5J1GgIFIR05JmfLli0uBPpdEbGxsbZ//37XjawjUN2+aNEiVzlUalcl0N+Oyy67LFiPBkWrQql1FS1a1N2m6ubJ0LbMnj07CK9Hjx51Y2mkcePG9uijj7rq5h9//GHt27d3gTSxKqAqo7rEpx34sZDNmIzfvrDNCE0PbRPaF71Ss21JfZBrmS7qiXnzzTeD+27YsMH1DqmqqO5lUdWvXbt2KQ4GGmOoIUZ+b4yGLWm/H/m8YRXm9mUJQdtSuv3pekKKQl/kKQ3++ecfN75QYwFVzVNX8uLFi10XQ3yqtMXvkdd//osuusiWLVvmLupKUAVSb4aORHX6Ax2dauyixv/5R6Xq9lX1zqffVd3zl0tkN3JKaFt0lBu5Leo+8dd//fXXux2Wzu+l8ZX+mEkASE90YK5qisZgi2Yra0iOHwxFQ3E09CeSDv7Vq5TQyKwbbrjBXnnlFTfOcMeOHa7QoKoTEDW8dGzPnj1e0aJFvaefftrbvHmz17t3b69q1are1KlTvYIFC3pr1qzxFixY4FWpUsUrW7ZsnMd27drVu/XWW71t27Z5M2fO9I4dO+bt3r3bK168uPf+++9727dv94YPH+4VK1bMi4mJ8aZPn+7Vrl3b++mnn9yySD/88IOXM2dO79NPP/V++eUXr169et79998fLC9Xrpw3e/bsRNsxbtw4r3HjxnFumzdvnnvcokWLXNvat2/vtWvXzi0bM2aMV61aNe+///2vt379eq9GjRresGHDUvy67d27V3tDb9euXV4YHT161Js8ebL7GTZhbpvQvuh1Jtum/deGDRuC61OmTHH74EKFCnlFihTxVq9eHSxbu3atlylTJm///v1x1qHHaz3a78cXGxvrPh9y5MjhLq1atfKOHDkS2vdO+NuMDv7nt34mJV1XDjWOT0eEGotXrVo1++6779ypCjTWRBeNx9PsZE1K0XhBHQH6NE5x3bp1bpab7qOjSHXhal3qolV39Icffuiua3xiw4YN3ey3Ro0aubErGnOomcRSp04dV9XTDGLdT9VHTVz5Ny699FI3+FljDdU2dSvrSFbUnayuZXV5qKv5nHPOcZNvACA9UD70J4uIzhih/bn2wz///LPr3Ykc5qOen/inC9PjtZ7Icec+jRXXuG+d0UITGfU5kNjZIIC0KF3PVj6T+vXr58YBqjtZE1I0wFmBTJNSoo26YBSs9W0D/my+sA0+1g5dQwCifXxJemqb0L7oFea2Ce2LXjEhapv/+c1s5TRCZ8jXKW40O1l/aPqp82YBAACkJYTDM0Rdx+q2BgAASMvS9ZhDAAAAxEU4BAAAQIBwCAAAgADhEAAAAAHCIQAAAAKEQwAAAAQIhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgAAIAA4RAAAAABwiEAAAAChEMAAAAECIcAAAAIEA4BAAAQIBwCAAAgQDgEAABAgHAIAACAAOEQAAAAAcIhAAAAAoRDAAAABAiHAAAACBAOAQAAECAcAgAAIEA4BAAAQIBwCAAAgADhEAAQFXbt2mUVKlSwjRs3BretWrXKLr74YitQoIA98sgj5nlenMesXbvWChYseFLP89FHH1m5cuWsZMmS9u6776ba9gPRIvOpPnDmzJl2xRVX2JEjR+zVV1+1Y8eO2d133205c+ZM3S1EmlVvyCw7ljmXhU22TJ4Nr2t2/oAZduR4BguTMLdNaF942rZx6DUnBMNWrVrFCYb6/GndurVdddVV9t5771mvXr1s/Pjx1qVLF7d8/fr11rJlS9u9e3eKt0Nh85ZbbrGXX37Z6tWrZ9dff73Vrl3bqlSpkoqtBUJYObz33nuta9euFhsbaw8++KCNGzfO3n77bbv99ttTfwsBAOlehw4d7Oabb45z2/Tp023v3r02cuRIq1Spkj399NP2xhtvBMsVHO+6666Tep7XX3/dmjZt6j7jatSoYffcc4/7fAPSk1MKh5MmTbJp06ZZxowZXfldVcTJkyfbjBkzUn8LAQDp3tixY11lMNLy5cutfv36QY9VzZo17aeffgqWf/7553bDDTec1PNonZdffnlwvW7durZkyZJ/vf1A6LuVM2XK5MZ1LF261IoXL25Fixa1ZcuWWfbs2S1MFi5c6I4a16xZY+eff77rrqhevbqtWLHCHcFu27bNOnfu7I5e/+///s9VVL/88ks37mXz5s1up6SuiWzZsiX7XOXLl3dHrLNmzXKVWP0877zzgp3ioEGDXNdI8+bN7a233rLcuXPbgAEDXBdLxYoV3ZGzxty888471rBhQ/c4jZV54IEH3I5TXSN6nIK8dqDPPPOMvfTSS3b06FF77LHH7L777kt029R1o4tv37597me2jJ5lyhR3fE8YqF2RP8MkzG0T2heetsXExMRZXrp06eA2/dRlz549bmxg5H31+fTnn3+6/aEe43dDx19fYlSJLFOmTHD/HDly2NatW1P8+MREbnsYhbl9MSFqW0rbcErhUN3Hl112mWXIkMEeffRR+/XXX90YjZM9QkvL1GWu9mgcZbdu3VyYevjhh13FtEePHtaxY0c3/uXSSy914VChUQOfr732WhcIGzdubO3atbMRI0ZY3759U/Sc/fr1s8qVK9vEiRNdWJTVq1dbz5493fNWq1bNbr31VnvllVfc6y66XWNqFNT1+D59+ti8efNckFR3ypQpU2zLli3Wu3dvF+A1MFtdJOp++eKLL1w7NV7noosuskaNGiW4XUOGDLGBAweecHvfWrGWM+dxC6tBdWItrMLcNqF90d827dsSM3v2bCtWrJj9/vvvdvz48Tj3VeFCFcNChQq56zt27Eh2fZH++ecfN+7Qr0b+8ccfbrxjSh+fHB2gh1mY2zczBG07ePDg6QuHw4cPt2bNmrkjKoXEDRs22P333x8MAg4LBS4dfapSqCNUVRBFIUtVxHPPPddV9zZt2uSqdQptF154oRurIgqWb775ZorDYb58+U4Y26JxNNu3b3dV2e+//96lfn87JHPmzDZmzBhXnezUqZN1797d3f7bb79Znjx5XPeIqn6qcCrMaz16DgXHBg0aBONypk6dmmg4VODU2NLIyqGOrAcvzWjHsmSysFHlQh9Q/X7MaEdiQzboP8RtE9oXnratGnBVovfVmEAdQOvgWRcdIPs0ObJFixZWpEgRd92vHEbeJymjR4921Uj//trf58+fP8WPT4z23QoX6v3JkiWLhU2Y2xcTorb5PX+nbbayqk0+nVpA1bUw0XjKUaNGucHN6rZVGNIRqqi6t2jRIitcuLALYaoaiip0CpTakfg7KXX/ppS6peM7dOiQe23nz59vF1xwgesy8bdDNN7G77bOmjVrcBoH7ThVPVy3bp3bLlUMdaTtb6e6zBUq5fDhw3bdddclul1af0Jd49qBHwvZjMn47QvbjND00DahfdHftqQ+hLVMF+3/dADu31eFCh0Ma1+nfaV/38ifydEYw8WLFwcTWVRFVPd0aoUCf9vDKsztyxKCtqV0+0/5PIealKLZY6qYKSDdeOONrvQeFnPmzHFjADW4WTuKO++8092u8KUwqIHRGm+pap1Cm2gHoiqcjjR10cDmkylD58p14mlhnn/+eTcGRl0bGod4ySWXxFmeN2/eBNeloFi1alVX2dQRr46GFXj97VQ3ceR2qusYAKKJeq5UCdE4bdFwGZ1izQ+GSVFvUOSBtk/DgXRanJUrV7ou5hdeeCFOMQRID06pcvj444/bhAkT7LbbbnNjO/zQoS7Njz/+2MJg//79wQ5E4VfdqgqG6tJVFU+VN3UDq6LoU1hWmNP9NYFl2LBhtmDBAvvxxx//1XZoXODOnTtdYFXI0+SS5GjnVqpUKRfiFWLVPe5ToH3uuedc14sqmzpC1klkNa7yZHzfp1kwridsXQgaX6RurWg/SkxPbRPal77apmE1OojXGHBNBNRnkfaTKaF9onp6NBQokg72NUGvTp06bhjOOeec44YIAenJKVUONXtWkzBUbfLLrJot+/XXX1tYKDjpopOfagKKunY1O1k7FM3O1oQTdadr3KWW++MDNSNYQVJdzxqr+G/Prq+xnOom0fhGHR2rgqlqX3JULVSA1bhCBTiNv9FOVDSp5aabbrJrrrnGatWq5drx5JNP/qvtBIAzQQfp/oQ9adOmjRs+o4LFzz//HAzz8em+8b81xV9P/GDoe+qpp1xw1Knavv32W7efB9KTU6ocakydTtWiE4T6NNXfH9MWBgq8mjUc6aGHHnJjEBUONYFDs9kUABXENElHXbx+qDxZkWf9j6TKpMY3JkSnsonUpEmTYD2q7vqn19FEFJ3iRlVHTZbxZ5n7M54BIJqpd0QHu6lJITN+0ATSi1OqHGr2bdu2bV0pX1UtTdzQ7zqVSthplpwmmqjbuESJEq5LdujQoYmO/RN1LStQJ3Q5XQFNpxb67LPPXFVQR86qYCrAAgAApHrlUGPWFDhUjVK16sCBA647NbFToYSJZi5rYsjJ0NiVxLqCkwqV/8apVjABAED6lvnfzBLTBcnToObIMTIAAACh6lbWoF+dfw8AAADhckrhUN+Oom/rAAAAQLicUjjUV7H5Jx0FAABAOg+HOgO9TvSsUwfofIfz5s0LLgAAAEhnE1J0rjzRV7pFnjle589bv3596m0dAAAA0n441JebAwAAIHxOqVsZAAAA4XRKlUN964a6kBNCtzIAAEA6C4fjx48Pfj948KD9+OOP9tprr9kTTzyRmtsGAACAaAiHjRs3jnP96quvdt+tfOedd1q3bt1Sa9sAAAAQrWMO9fVwW7duTa3VAQAAIFoqh126dIkz5jA2NtaWLFlilStXTs1tAwAAQDSEQ1UJIykoXnrppa5rGQAAAOksHPbv3z/1twQAAADROebwgw8+sOPHj8e5bf78+Xbbbbel1nYBAAAgWsKhuo8PHDgQ57ZKlSrZhx9+mFrbBQAAgLTerbxp0yb30/M827x5s+XJkye4Pm3aNCtduvTp2UoAAACkvXCoiSiafKJLjRo1gtt1XTOVx4wZczq2EQAAAGkxHOqUNZIxY0bbvXu35cuX73RtFwAAAKJlzGGVKlUsc+ZTmugMAACANOyUEt7PP/+c+lsCAACA6AyHBw8etFdeecXWrFkTnNJGk1KWLVtmS5cuTe1tBAAAQFoOh506dbJdu3ZZTEyM616uX7++jR492rp27Zr6WwgAAIC0HQ5nzpxpP/30k/3yyy82dOhQGzZsmF1wwQU2YcKE1N9CAAAApO0JKfnz53fBUBXD5cuXu1nMTZs2tUWLFqX+FgIAACBtVw779u1rV199tW3fvt0aNmxoV155pQuI559/fupvIQAAANJ25bBbt25u8kmuXLls3Lhxdumll1rt2rXddy4DANIXfQ6oOKBeJX29qsaky5QpU6xixYpubPqFF16Y4jNdzJ0716pVq2aFCxe2kSNHnuatBxDfKZ+ssHr16u5ntmzZrH///pZWjR8/3l3mzJljYZCW2lNvyCw7ljmXhU22TJ4Nr2t2/oAZduR4BguTMLdNaN+ZsXHoNcHvX3/9tfXq1cs++eQTdw7cnj17Wtu2bd1+qkuXLvbqq69a48aN7d5773WTFhcuXJjkunfu3Glt2rSxhx56yAXNDh06WK1atdzQJQBpuHKoWcpPP/201atXz0qVKmWrV6+2unXr2rp161J/CwEAadZbb71lt99+uzVv3tzKli1rI0aMsAULFrgQqAmLN954oxUrVsyFxpSc6uzdd9+1kiVLWr9+/eycc86xJ554wt54440z0hYA/yIc3n333a4L+Y477rD9+/dbzpw5rUGDBta9e/dTWR0AIEqpC1mh0JcpUyb389prr7W77roruF3nxVXYS86KFStclTBDhv9VRlV4WLJkyWnZdgCp2K380Ucf2Y8//miVKlWyxx57zO0Mevfubeeee66lRUePHrX27dvb9OnT7bLLLnPdHUWLFnVHu+XLl7fKlSvboEGD7P7773dHt7Jq1Srr0aOHrVy50k26ee2116x06dJuHMzLL79s+/bts+uvv94OHDjgjmwPHz5sL774YtDFsnHjRjfGRkfVWr98+eWX9sgjj9jmzZvthhtucOtRt3xytG1at8bzaCJQpLFjx7rl+q5rHbnr+XLnzm13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dAJZddWcCp1qR+ed1NdZqXsHAAAgVcOhvlgdqU8TQzRBJSF58+Y95fVqdp/GRgIAAJyWcKhTviD16ZQP+pYWAACAqP1uZQAAAIQT4RAAAAABwiEAAAAChEMAAAAECIcAAAAIEA4BAAAQIBwCAAAgQDgEAABAgHAIAACAAOEQAAAAAcIhAAAAAoRDAAAABAiHAAAACBAOAQAAECAcAgAAIEA4BAAAQIBwCAAAgADhEAAAAAHCIQAAAAKEQwAAAAQIhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgAAIAA4RDAKduxY4ctXrzYDhw4cLY3BQCQSgiHAFKsRYsWNn78ePf7c889Z1WqVLHbb7/dSpcubfPnz0/ROj766CMrV66clSxZ0t59993TvMUAgJOV+aQfgTRLH9q6zJkz54w8X70hs+xY5lwWNtkyeTa8rtn5A2bYkeMZLD22bePQa064beLEiTZjxgzr0KGDrV271oYOHWqrV6+2UqVK2YABA6xfv37J/u2tWrXKbrnlFnv55ZetXr16dv3111vt2rVdyAQApA1UDgEk6++//7aHHnooCHFHjhyx1157zQVDUcD766+/kl3P66+/bk2bNrWuXbtajRo17J577rG33377tG8/ACDlCIcAkqVg2LZtW6tfv767ft5551mbNm3c7xpvqEqglidn+fLldvnllwfX69ata0uWLDmNWw4AOFmEwzNsxYoVdv7551vBggXtgQcesKpVq9qLL75oX375pauk5M+f31VVVJkRdddpTNeTTz7pllWoUMEWLlwYrG/QoEFWtGhRO/fcc23p0qVxnuutt96yc845xwoXLmz/+c9/zPO8YFmGDBlcl2D37t3dtjChAImZPXu2zZo1y4YPH37CsmnTplmJEiVs27Ztrls5Ofv27XN/w768efO6xwIA0g7GHJ5hPXr0sI4dO1qrVq3s0ksvtenTp1vWrFmtUaNGrvrSuHFja9eunY0YMcL69u0bfAC3bNnShT99APfp08fmzZtnU6dOtVGjRtnkyZMtc+bM1rp1axcwRcsVMj/++GMrW7ase3z16tXt1ltvDbalW7durhKk+2TPnj3RbVZQ9cOq/wEv2TJ6linT/wucYaF2Rf4Mk5S2LSYmxv08fPiw3XXXXe4ARn8jsbGxdvz48WC5uog//fRTu++++6x37942bNiwJNeb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bIu6YSPbXbZsWcuTJ49df/319s8//wTLtH16zfr06WPFixe31atXu9urVq0ahCptj35/7733gscpnKkqp3XedNNNdvjwYTsTFPi0nV9++aW98MILSd5X74e23aegvm3btjOwlQAApF9prlv51ltvtYceesgFpIEDB7ouxauuuspWrVrlQtjChQvt9ddft/vvv98Fpc2bN1vLli1d2GnWrJm7/fbbb7fJkye79SmETJgwwS655BK77bbb3Pqef/75ZJclJbFt8TzPrWfIkCFuwkXr1q1t6dKlLigm5dtvv3WTNBQQa9So4ba/f//+rhtWYa9nz542bdo0NzFDr88rr7xijz76aPB4bXflypVdN6wfZn/44Qc7fvy4C8wKZAqXuXL9rwv4l19+ccFVQVbbptdar0P37t0T3L4jR464i88P0dkyepYpk5fgY1QdTIjaoLY8/PDDdscdd9j777+f6OuSMWNGV73115UpUyY7ePBgoutOLf76T/fznA1hbpvQvugV5rYJ7YteMSFqW0rbkObCYY4cOdzGFyxY0F577TU7duyYTZo0yQ4cOOACTNGiRV2oGDZsmLv/O++84yqM3bp1c9dHjx7tgtn27dvd9YYNG1qnTp3c771797YHHnggCIBJLUtKYtuiCRSqbClsZc2a1VW6NK7u3HPPTXJ9qkYq9GnyhajdfoWsUqVKri3Zs2d3p4DRa7NmzZo4j1e18e23345zmyqCPm1H/vz5g+vZsmVzP48ePeoqc1pvUhR2FdTj61sr1nLmPJ7gYxQAk6IQ3aNHD/vggw8sd+7cCd5HFVJNRKlYsWJwXQExuXWnlpkzZ1pYhbltQvuiV5jbJrQves0MQdtUYInKcKiwpy7f4cOH2wUXXOAqgn7FSWFMFLx8qhz64UFKlSrlws+mTZvcdXXrRi7bsWNHcD2pZUlJbFsKFSrkKnUKNAqo6hpWRS85akPkbOwqVaq4ixw6dMgF3/nz57vXQ+FIFcFI9957r50MBcIxY8a4rmh127do0cJ18RYpUiTB++t+Dz74YJzKoV67wUsz2rEsmRJ8zKoBV8W5rq5/hbqhQ4e661u3bnVd3XruxMZ1/vnnn64rXJVhv5tfz+tfP10UwLUTaN68uWXJksXCJMxtE9oXvcLcNqF90SsmRG2LP3wuKsKhEq0qhXoT9FNdq+piVTBJLECou1Td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txrZvqT2MdH4XiZ0KpuE9jFheO+S2sdE43t3sjLon7NdvUR02b59uzstgcZjFCpUyMIqzO1UN4hOrnzppZda7ty5LWzC/N6FsX1JtYe/1ejFexe9CIcAAAAIMFsZAAAAAcIhAAAAAoRDAAAABAiHAAAACBAOAQAAECAcAsApmjNnTvANEQAQFoRDAAiB8uXLu7AKAP8W4RAAAAABwiEApHIFr0ePHpYvXz576KGH7Oqrr3bfnvDDDz/YgAED3PXGjRu75R06dLB9+/YFj503b55deOGFVqBAAbv55pttz549wbImTZrY+PHjbeTIkVauXDmbNm2au71FixaWIUMG+/33361p06bu96FDhwaPmzJlilWpUsVy5cplzZo1s23btrnbtS6tc+zYsVasWDF3+eSTT4LHzZo1y2rWrGl58uRx27xly5Zg2Zdffmk1atRwXepdu3a1I0eOpOi1GTVqlJUsWdKt86abbrLDhw8Hy5577jkrW7ase6169uxpMTExwbKXX37Zva4lSpRwr2FsbGywTO1dvXq1de/e3QoWLGgHDhxwt+v7HUaMGOFeKz3u+eefP4l3EUjnzvb39wFAtJo9e7aXL1++OLeVK1fO69ixozdmzBj3Xa36ft3LL7/cGzx4sNe/f39324QJE7xff/3Vq1evnterVy/3uE2bNnm5cuXyXnvtNW/dunVe69atvWuvvTZYb+PGjd33vLZo0cKbPn26t2vXLnf7P//84+3evdsrU6aM99lnn7nfDx8+7Jb9/fffXrZs2dx33m7bts3r0KGD17NnT7dMt+l7YbW+3377zevdu7dbh6xfv959n+wbb7zhtuvGG28MtkX3zZo1qzd27FjXhho1aniDBg1K9rX6+eefvUyZMnlz5851j6tdu7b36quvumWTJk3yihYt6pbpflWrVvVGjRrlln300Ufuu2v1Wi9ZssSrXLlysEz0el5yySXeAw884H3zzTfesWPH3O16jfPnz+8tXLjQmz9/vvseXP0EkDzCIQCkcjhUeNOyYsWKuds6d+7sgqEuDRs2DO77ySefuPvL008/7TVv3jxYtmXLFhd8/vjjjyAcnn/++d6RI0cS3BatR88Z6ejRo9727du9Q4cOuWCkwKmg6ofD7Nmzezt27HDX16xZ455PnnrqKe/KK68M1rN582YXPEUht27dusGy0aNHexdffHGyr5UCp8LhzJkzvZiYmOAiarfa71MI/P77793v2g5tj++dd97xqlSpElzXNt91110nPN8VV1zhPfroo8H1m266yXvkkUeS3U4Anpf5bFcuASBssmfPHudnpDJlygS/lypVynbs2OF+37x5s1WsWDHOsmzZstmmTZusePHi7jZ1V2fNmjXF26Hs9Nhjj9nUqVOtWrVqrjv3+PHjwXLdVrRoUfd75Hrjb0vp0qXdRdS9vHTp0mCW9rFjxyx37tzJbkuFChVszJgx1qdPH1u7dq3rDn/hhResSJEiJzxf7dq1E92WSpUqudckUq9evU54Pm3nwoUL3XOKurCvu+66ZLcTAGMOAeCM2rhxY5zg4wc/jbdbv359sExjAzWWT2PmfBo3mJiMGTO6MBhp0qRJ9t1337nxiAsWLLDWrVvHWZ43b94E16UAG7mdv/76q9WqVcuN9VNI1HqWLVvmLsuXL7eZM2cm2261p06dOm7spda9a9cuGzRoUILPN3HiRDeWMaHXRb9HviaJvS7azoEDB8bZziFDhiS7nQAIhwBwRimsTZgwwX777TcbNmyYtWvXzt1+yy232LfffusmiGzYsMFNylClSxNFUkIVta+++sr++OMPN5lE9u/f7wLj33//bdOnT3dhLH6ATEjHjh3d5BhNWlGAHTx4sKswKoBqEs38+fPd9quy+eKLL1qXLl2SXeeqVavsyiuvdNU8bZdfdZQ77rjDTUhRgP3ll1/cRBK1R7p16+aWzZ0711Us+/fv7yqoyenUqZO99957wWtw1113uYktAFLgbPdrA0DYxhzqdl388YSRYw417q9Ro0Ze7ty53QSRffv2BY+dM2eOd8EFF7h1apkml/g05lDjBBOzdOlSNzkkc+bMbv2yd+9e76qrrnKTMTT5Rc+vyR0ag6h1aZ2+DRs2BGMORWMDtb48efK4bd66dWuwTGMqNf5R623atKmbYJIS/fr180qUKOEmuzRr1izOOkeOHOmVLl3aK1y4sHffffe58ZK+F1980StbtqxXvHhx14bjx48Hy7TN2vb4YmNjvWHDhrlJNno99R4cOHAgRdsJpHcZ9E9KQiQA4N/RaVjUfaqKHACkVXQrAwAAIEDlEAAAAAEqhwAAAAgQDgEAABAgHAIAACBAOAQAAECAcAgAAIAA4RAAAAABwiEAAAAChEMAAAAECIcAAAAw3/8HOU0LxYBEtK0AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "===== 使用sklearn API =====\n",
      "sklearn API分类准确率: 0.9385\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import xgboost as xgb\n",
    "from sklearn.datasets import load_breast_cancer, load_diabetes\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.25,random_state = 10)\n",
    "\n",
    "# 转换为DMatrix格式（XGBoost优化的数据结构）\n",
    "dtrain = xgb.DMatrix(X_train, label=y_train)\n",
    "dtest = xgb.DMatrix(X_test)\n",
    "\n",
    "# 设置参数\n",
    "params = {\n",
    "    'objective': 'binary:logistic',  # 二分类问题\n",
    "    'eval_metric': 'logloss',        # 评估指标\n",
    "    'max_depth': 3,                  # 树的最大深度\n",
    "    'eta': 0.1,                      # 学习率\n",
    "    'subsample': 0.8,                # 样本采样比例\n",
    "    'colsample_bytree': 0.8,         # 特征采样比例\n",
    "    'gamma': 0,                      # 节点分裂所需的最小损失减少\n",
    "    'lambda': 1,                     # L2正则化项\n",
    "    'alpha': 0,                      # L1正则化项\n",
    "}\n",
    "\n",
    "# 训练模型\n",
    "num_rounds = 100\n",
    "model = xgb.train(params, dtrain, num_rounds)\n",
    "\n",
    "# 预测\n",
    "y_pred_proba = model.predict(dtest)\n",
    "y_pred = np.round(y_pred_proba)  # 转换为二分类标签\n",
    "\n",
    "# 评估\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"分类准确率: {accuracy:.4f}\")\n",
    "print(\"分类报告:\")\n",
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "# 特征重要性可视化\n",
    "xgb.plot_importance(model)\n",
    "plt.title('特征重要性 (分类)')\n",
    "plt.show()\n",
    "\n",
    "# ================\n",
    "# 使用sklearn API的示例\n",
    "# ================\n",
    "print(\"\\n===== 使用sklearn API =====\")\n",
    "from xgboost import XGBClassifier, XGBRegressor\n",
    "\n",
    "# 分类任务\n",
    "clf = XGBClassifier(\n",
    "    n_estimators=100,\n",
    "    max_depth=3,\n",
    "    learning_rate=0.1,\n",
    "    subsample=0.8,\n",
    "    colsample_bytree=0.8,\n",
    "    random_state=42\n",
    ")\n",
    "\n",
    "clf.fit(X_train, y_train)\n",
    "y_pred = clf.predict(X_test)\n",
    "print(f\"sklearn API分类准确率: {accuracy_score(y_test, y_pred):.4f}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7514ca82-c4f9-4f23-9f38-723eac213424",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
